[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