[vz-users] Aktuelle Leistungsdaten an Siemens S7-300 übergeben

Heine.thomas at online.de Heine.thomas at online.de
Sun Aug 28 14:36:12 CEST 2016


Hallo,

ja, hatte ich auch zuerst versucht. Leider gibts da keine Vorhersage der 
Sonnenstunden.
Abhängig von den Sonnenstunden der nächsten Tage steuere ich meinen 
Heizstab, oder eben meine Wärmepumpe an.

Irgendwann werde ich auch düe übnergebenen Temperaturen zur 
FBH-Steuerung hinzuziehen (wenns wärmer wird, die FBH etwas absenken - 
und umgekehrt)
Die Scripts sind in Python geschrieben (ettliche Vorlagen kamen aus dem 
Netz...)

Die Wetterdaten werden Ausgelesen und über SNAP7 an die SPS übergeben 
(alle 2 h):
############################################################################

import httplib

import re

import snap7.client as c

from snap7.util import *

from snap7.snap7types import *

conn = httplib.HTTPConnection("www.wetter24.de")

conn.request("GET", "/vorhersage/7tage/deutschland/xxxxxxxxx/xxxxxxx/")

response = conn.getresponse()

data = response.read()

conn.close()

def between(value, a, b):

# Find and validate before-part.

pos_a = value.find(a)

if pos_a == -1: return ""

# Find and validate after part.

pos_b = value.rfind(b)

if pos_b == -1: return ""

# Return middle part.

adjusted_pos_a = pos_a + len(a)

if adjusted_pos_a >= pos_b: return ""

return value[adjusted_pos_a:pos_b]

def before(value, a):

# Find first part and return slice before it.

pos_a = value.find(a)

if pos_a == -1: return ""

return value[0:pos_a]

def after(value, b):

# Find and validate first part.

pos_b = value.rfind(b)

if pos_b == -1: return ""

# Returns chars after the found string.

adjusted_pos_b = pos_b + len(b)

if adjusted_pos_b >= len(value): return ""

return value[adjusted_pos_b:]

text1 = "icon weather sunduration"

text2 = "forecast_chart_sun"

text3 = "<td"

text4 = "colspan"

text5 = "icon weather rain"

text6 = "Niederschlagswahrscheinlichkeit"

text7 = "chsttemperatur'"

text8 = "Tiefsttemperatur"

text9 = "data:"

text10 = "marker"

# Test the methods with this literal.

test =(between(data, text1, text2))# Ausmaskieren Teil 1

test2 = (between(test, text3, text4))# Ausmaskieren Teil 2

test3 = re.findall(r'[\d\.\d]+', test2) # Int oder Float aus string filtern

#Ergebnis: Sonnenscheindauer der naechsten 7 Tage als LIST

test4 = (between(test, text5, text6))# Ausmaskieren Teil 2

test5 = re.findall(r'[\d\.\d]+', (test4)) # Int oder Float aus string 
filtern

#Ergebnis: Regenmenge der naechsten 7 Tage als LIST

test6 = (between(data, text7, text8))# Ausmaskieren Teil 2

test7 = (between(test6, text9, text10))# Ausmaskieren Teil 3

test8 = re.findall(r'[\d\.\d]+', (test7)) # Int oder Float aus string 
filtern

#Ergebnis: Regenmenge der naechsten 7 Tage als LIST

#print (test3)

value4 = test3[0]

value5 = test3[1]

value6 = test3[2]

value7 = test5[0]

value8 = test5[1]

value9 = test5[2]

value10 = test8[0]

value11 = test8[1]

value12 = test8[2]

def ReadMemory(plc,byte,bit,datatype):

result = plc.read_area(0x83,0,byte,datatype)

if datatype==S7WLBit:

return get_bool(result,0,bit)

elif datatype==S7WLByte or datatype==S7WLWord:

return get_int(result,0)

elif datatype==S7WLReal:

return get_real(result,0)

elif datatype==S7WLDWord:

return get_dword(result,0)

else:

return None

def WriteMemory(plc,byte,bit,datatype,value):

result = plc.read_area(0x83,0,byte,datatype)

if datatype==S7WLBit:

set_bool(result,0,bit,value)

elif datatype==S7WLByte or datatype==S7WLWord:

set_int(result,0,value)

elif datatype==S7WLReal:

set_real(result,0,value)

elif datatype==S7WLDWord:

set_dword(result,0,value)

plc.write_area(0x83,0,byte,result)

if __name__=="__main__":

plc = c.Client()

plc.connect('192.1XX.XXX.XXX',0,2)

WriteMemory(plc,812,0,S7WLReal,value4)# Sonnenscheindauer heute

# Uebergabe an MW812....

WriteMemory(plc,816,0,S7WLReal,value5)# Sonnenscheindauer morgen

WriteMemory(plc,820,0,S7WLReal,value6)# Sonnenscheindauer uebermorgen

WriteMemory(plc,824,0,S7WLReal,value7)# Regenmenge heute

WriteMemory(plc,828,0,S7WLReal,value8)# Regenmenge morgen

WriteMemory(plc,832,0,S7WLReal,value9)# Regenmenge uebermorgen

WriteMemory(plc,836,0,S7WLReal,value10)# Max Temp heute

WriteMemory(plc,840,0,S7WLReal,value11)# Max Temp morgen

WriteMemory(plc,844,0,S7WLReal,value12)# Max Temp uebermorgen

plc.disconnect()


###################################################################################################


Hier das Skript für den Strom (2s-Zyklus):
####################################################################################################

import httplib

import snap7.client as c

from snap7.util import *

from snap7.snap7types import *

conn = httplib.HTTPConnection("xxx.xxx.xxx.xxx")

conn.request("GET", 
"/middleware.php/data/xxxxx-xxxxx-xxxxx-xxxxx.txt?from=now")

response = conn.getresponse()

data1 = response.read()

prevalue1 = (data1).strip(' Wh')

value1 = ((float(prevalue1)) * 1.0)# Strom aktuell erzeugt

#print (value1)

conn.request("GET", 
"/middleware.php/data/xxxxx-xxxxx-xxxxx-xxxxx.txt?from=now")

response = conn.getresponse()

data2 = response.read()

prevalue2 = (data2).strip(' Wh')

value2 = ((float(prevalue2)) * 1.0)# Strom aktuell geliefert/bezogen

#print (value2)

conn.close()

def ReadMemory(plc,byte,bit,datatype):

result = plc.read_area(0x83,0,byte,datatype)

if datatype==S7WLBit:

return get_bool(result,0,bit)

elif datatype==S7WLByte or datatype==S7WLWord:

return get_int(result,0)

elif datatype==S7WLReal:

return get_real(result,0)

elif datatype==S7WLDWord:

return get_dword(result,0)

else:

return None

def WriteMemory(plc,byte,bit,datatype,value):

result = plc.read_area(0x83,0,byte,datatype)

if datatype==S7WLBit:

set_bool(result,0,bit,value)

elif datatype==S7WLByte or datatype==S7WLWord:

set_int(result,0,value)

elif datatype==S7WLReal:

set_real(result,0,value)

elif datatype==S7WLDWord:

set_dword(result,0,value)

plc.write_area(0x83,0,byte,result)

if __name__=="__main__":

plc = c.Client()

plc.connect('192.xxx.xxx.xxx',0,2)

value0 = ReadMemory(plc,800,0,S7WLByte)   # Lese MW 800 (Life Bit)

WriteMemory(plc,802,0,S7WLWord,value0) #Schreibe MW802 (Life-Bit)

WriteMemory(plc,804,0,S7WLReal,value1)# Strom aktuell erzeugt

#ReadMemory(plc,800,0,S7WLReal)

WriteMemory(plc,808,0,S7WLReal,value2)# Strom aktuell geliefert/bezogen

plc.disconnect()

#########################################################################################

Mancher mag meine Skripte für völlig überzogen, unpassend oder auch 
schlecht befinden.
Aber für mich, mit meinen Laien-Mitteln, finde ich die Lösung wirklich 
genial.

Gruß

Thomas


Am 28.08.2016 um 12:22 schrieb china2013 at abwesend.de:
> Am 25.08.2016 um 12:40 schrieb Heine.thomas at online.de:
>> Hallo,
>>
>> *DANKE an euch alle!!!!!**
>>
>> *Ich habs geschafft.
>> Ich übertrage zyklisch (alle 15s) die Leistungen meiner Stromzähler 
>> (Zweirichtungs-Zähler und PV-Zähler) auf meine S7-315 Steuerung mit 
>> Hilfe von Snap7.
>> Des weiteren hab ich mir ein kleines Script geschrieben, um 
>> Sonnenscheindauer, Regenmenge und Max-Temperaturen der nächsten 
>> 3(ggf.7) Tage
>> aus der Wetter24.de-Hompage für meinen Ort auszuschneiden.
>> Auch diese Werte übertrage ich (alle 2h) jetzt auf meine Steuerung!
>> Jetzt hab ich wieder eine riesige Spielwiese für meine 
>> Heizungssteuerung bzw. Eigenverbrauchsoptimierung
>>
>> Gruß
>>
>> Thomas
> Offtopic:
> Hallo Thomas,
>
> warum der Aufwand mit der Wetter Homepage? Bestimmt kennst Du das noch 
> nicht: http://openweathermap.org/api
> Du brauchst nur einen einen kostenlosen Key von hier 
> http://openweathermap.org/price
>
> Dann bekommst Du mit so einem Beispiellink:
> http://api.openweathermap.org/data/2.5/forecast?q=Berlin,de&mode=json&appid=11111111111111111111111111111111
>
> dieses Resultat, (der Key "appid=111111..." muss gegen deinen eigenen 
> getauscht werden)
> {"city":{
>     "id":2950159,
>     "name":"Berlin",
>     "coord":{"lon":13.41053,"lat":52.524368},
>     "country":"DE",
>     "population":0,
>     "sys":{"population":0}},
> "cod":"200","message":0.0336,"cnt":36,"list":
> [{    "dt":1472385600,"main":{
>         "*temp*":304.28,
>         "*temp_min*":304.28,
>         "*temp_max*":306.136,
>         "*pressure*":1019.69,
>         "sea_level":1025.3,
>         "grnd_level":1019.69,
>         "*humidity*":36,
>         "temp_kf":-1.86},
>     "*weather*":[{"id":800,"main":"Clear","description":"clear 
> sky","icon":"01d"}],
>     "*clouds*":{"all":0},
>     "*wind*":{"speed":3.57,"deg":181.508},
>     "sys":{"pod":"d"},
>     "*dt_txt*":"2016-08-28 12:00:00"
> }]} ...und so weiter
>
>
> Willst Du uns dein vzlogger.conf und Scripts zeigen, wie du es gemacht 
> hast?
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://demo.volkszaehler.org/pipermail/volkszaehler-users/attachments/20160828/042d5b08/attachment-0001.html>


More information about the volkszaehler-users mailing list