Acties:
  • 0 Henk 'm!

  • con1
  • Registratie: Juni 2005
  • Laatst online: 08:20

con1

Energiefreak

Topicstarter
Weet iemand wat er fout gaat als er soms halve telegrammen worden gelezen?
Ik leg uit. Sind juli/augustus 2013 lees ik mijn slimme meter uit met de Raspberry.

Dit ging feilloos meer dan een half jaar lang en kon daar hele mooie grafieken
van maken. Wel op zijn "jan boeren fluitjes" maar toch.

De laatste maand heb ik problemen met het uitlezen soms, denk dan aan 1 uur
per 2 a 3 dagen, krijg ik mailtjes met foutmeldingen dat een van de variabelen
niet zou zijn gedefinieerd.

Als ik dan handmatig een telegram opvraag dan begint het telegram op de
tweede helft, vervolgens de naam van de meter en dan de andere helft.
Dan begrijp ik dat mijn variabelen niet meer worden gevuld. Wie heeft hier
een verklaring voor.

Het stukje python is;
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
meter=serial.Serial(port='/dev/ttyUSB0', baudrate=9600, bytesize=serial.SEVENBITS, parity=serial.PARITY_EVEN, stopbits=serial.STOPBITS_ONE, xonxoff=0, rtscts=0, timeout=20)

growatt = ModbusClient(method='rtu', port='/dev/ttyUSB1', baudrate=9600, stopbits=1, parity='N', bytesize=8, timeout=1)
growatt.connect()

teller=0
while (teller==0):
    p1_raw = meter.readline()
    p1_str=str(p1_raw)
    p1_line=p1_str.strip()
    if "0:1.8.1" in p1_line:
        ad= int(1000 * float(p1_line[10:19])) # ad= afgenomen dal
    if "1.8.2" in p1_line:
        ap= int(1000 * float(p1_line[10:19])) # ap= afgenomen piek
    if "2.8.1" in p1_line:
        gd= int(1000 * float(p1_line[10:19])) # gd= geleverd dal
    if "2.8.2" in p1_line:
        gp= int(1000 * float(p1_line[10:19])) # gp= geleverd piek
    if "96.14.0" in p1_line:
        ta= int(float(p1_line[12:16])) # ta= tarief dal versus piek
    if "1.7.0" in p1_line:
        afm= int(1000 * float(p1_line[10:17])) # am= afgenomen nu
    if "2.7.0" in p1_line:
        gm= int(1000 * float(p1_line[10:17])) # gm= geleverd nu
            teller+=1
meter.close()

De foutmelding is (een deel ervan);
Delivery to the following recipient failed permanently:

pi@raspberrypi

Technical details of permanent failure:
DNS Error: Address resolution of raspberrypi. failed: Domain name not found
.....
NameError: name 'ad' is not defined

Wie kan mij helpen hierin?

Ik ben niet gek, ik ben anders. Blij als een ei met mijn Hyundai Inster Pulse.


Acties:
  • 0 Henk 'm!

  • francoski
  • Registratie: Juni 2010
  • Niet online
Dat is redelijk simpel: je slimme meter stuurt iedere 10 (waarschijnlijk) seconden het bericht weg over de seriele poort. Jij hebt er geen invloed op wanneer hij dat doet. Als je dus toevallig op het moment dat hij aan het "vertellen" is gaat luisteren, dan hoor je pas een half verhaal.

Je zult dus moeten wachten tot je de naam van de meter ziet, en vanaf daar gaan lezen.

Ik heb hiervoor het script van http://gejanssen.com/howto/Slimme-meter-uitlezen/ aangepast, dat is nu dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#
# DSMR P1 uitlezer
# (c) 10-2012 - GJ - gratis te kopieren en te plakken

versie = "1.0"
import sys
import serial
import os
import pwd

################
#Error display #
################
def show_error():
    ft = sys.exc_info()[0]
    fv = sys.exc_info()[1]
    print("Fout type: %s" % ft )
    print("Fout waarde: %s" % fv )
    return

#print pwd.getpwuid(os.getuid()).pw_name
################################################################################################################################################
#Main program
################################################################################################################################################
#print ("DSMR P1 uitlezer",  versie)
#print ("Control-C om te stoppen")

#Set COM port config
ser = serial.Serial()
ser.baudrate = 115200
ser.bytesize=serial.SEVENBITS
ser.parity=serial.PARITY_EVEN
ser.stopbits=serial.STOPBITS_ONE
ser.xonxoff=0
ser.rtscts=0
ser.timeout=20
ser.port="/dev/ttyUSB0"

#Open COM port
try:
    ser.open()
except:
    sys.exit ("Fout bij het openen van %s. Programma afgebroken."  % ser.name)      

type="all"
if len(sys.argv) > 1:
    type=sys.argv[1]

#Initialize
# stack is mijn list met de 20 regeltjes.
p1_teller=0
p1_max=37
daldag=99999.0
piekdag=99999.0
huidig=99999
gas=99999.0
stack=[]

while p1_teller < p1_max:
    p1_line=''
    #Read 1 line
    try:
        p1_raw = ser.readline()
    except:
    print sys.exc_info()[0]
        sys.exit ("Seriele poort %s kan niet gelezen worden. Programma afgebroken." %  pwd.getpwuid(os.getuid()).pw_name)      
    p1_str=str(p1_raw)
#    p1_str=str(p1_raw, "utf-8")
#    print p1_str
    p1_line=p1_str.strip()
    if (len(stack) == 0 and p1_line[0:8] == "0-1:24.1") or len(stack) != 0:
        stack.append(p1_line)
        p1_teller = p1_teller + 1

#Initialize
# stack_teller is mijn tellertje voor de 20 weer door te lopen. Waarschijnlijk mag ik die p1_teller ook gebruiken
stack_teller=0

while stack_teller < 37:
    # daldag
   if stack[stack_teller][0:9] == "1-0:1.8.1":
    daldag = float(stack[stack_teller][10:20])
    #piekdag
   elif stack[stack_teller][0:9] == "1-0:1.8.2":
    piekdag = float(stack[stack_teller][10:20])
    #current 
   elif stack[stack_teller][0:9] == "1-0:1.7.0":
        huidig = int(float(stack[stack_teller][10:16])*1000)
    #gas
   elif stack[stack_teller][0:10] == "0-1:24.2.1":
       gas = float(stack[stack_teller][26:35])
   else:
    pass
   stack_teller = stack_teller +1
#print "\n"
print daldag
print piekdag
print huidig
print gas
file = open("uitlezer.log","w")
file.write(str(daldag))
file.write("\n")
file.write(str(piekdag))
file.write("\n")
file.write(str(huidig))
file.write("\n")
file.write(str(gas))
file.close()

#print (stack, "\n")
    
#Close port and show status
try:
    ser.close()
except:
    sys.exit ("Oops %s. Programma afgebroken." % ser.name )


Deze schrijft een aantal waarden weg naar uitlezer.log (gewoon een tekstbestandje).

Ik heb hier wel het teruglever-verbruik eruit gesloopt en nog wat dingetjes. Je mag het gerust gebruiken maar ik garandeer niet dat het werkt. En ik gebruik ook een andere baudrate.

Ps: zou je code tussen [ code ] tags willen zetten?

Acties:
  • 0 Henk 'm!

  • con1
  • Registratie: Juni 2005
  • Laatst online: 08:20

con1

Energiefreak

Topicstarter
Beste francoski, ontzettend bedankt voor je reactie.
Ik kon helaas geen code snel ontdekken om het script
in code-tags te zetten vandaar de platte tekst.

In de basis had ik ook het script van gejanssen en heb later
er een hoop uitgesloppt omdat ik het "onnodige" ballast vond.
Ik ben daar wat overactief in geweest blijkbaar. Immers, met
het script van "ge" liep het als een trein maanden na maanden.

Ik was er al een beetje bang voor hetgeen je hebt geschreven
maar mijn kennis bestaat hoofdzakelijk uit het "lenen" van scripts
en het daarna met trial and error aanpassen.

Maar goed, ik ben allang blij dat je onderkent van die 10 seconden.
Ik had het al eens gelezen maar als het 1 x keer in de 2 a 3 dagen
voorkomt denk je daar niet aan.

Goed beschouwd heb ik maar 2 waarden nodig, afgenomen momentaan
en geleverd momentaan. Voor de rest gebruik ik helemaal niets.
De momentane waarde gebruik ik ook voor de dagwaarden en dat loopt
uiterst parallel aan de waarden die Enelogic laat zien.

Nogmaals, dank voor je reactie en ik heb stof tot perfectioneren.

Ik ben niet gek, ik ben anders. Blij als een ei met mijn Hyundai Inster Pulse.


Acties:
  • 0 Henk 'm!

  • francoski
  • Registratie: Juni 2010
  • Niet online
con1 schreef op maandag 13 oktober 2014 @ 22:11:
Beste francoski, ontzettend bedankt voor je reactie.
Graag gedaan :)
con1 schreef op maandag 13 oktober 2014 @ 22:11:
maar mijn kennis bestaat hoofdzakelijk uit het "lenen" van scripts
en het daarna met trial and error aanpassen.
Mijn kennis net zo goed :)

Succes ermee!