Acties:
  • 0 Henk 'm!

  • cobike
  • Registratie: December 2000
  • Laatst online: 12-09 07:49
De laatste weken ben ik bezig geweest met het uitlezen van mijn slimme meter (Iskra me 382) via mijn NAS (Zyxel NSA325v2). Op internet en in dit forum is al veel informatie te vinden, vooral uitlezen via RasberryPI. Maar aangezien mijn Nas ook een Linux variant draait, zou dit toch ook via de NAS moeten kunnen. Na veel speurwerk en gepruts is het uiteindelijk gelukt! Ik log nu mijn totaal meterstanden gas en elektra en huidig verbruik/teruglevering via Python naar Mysql database
Deze combinatie slimmemeter uitlezen via NSA325 heb ik op internet nog niet gevonden. Daarom wil ik graag de informatie met jullie delen. Als je een ander type Nas die FFP ondersteund, dan heb je misschien nog wat aanknopingspunten voor jouw oplossing.
De exacte installatie stappen weet ik zo niet helemaal meer, misschien wat te veel geprutst, maar het globale verhaal zal ik zo goed mogelijk proberen te vertellen.

Als eerste heb ik een FTDI USB to Serial kabel nodig. Je kunt deze kant en klaar kopen, maar ik heb 1 via ebay besteld, je moet er dan nog wel even een rj11 stekker op krimpen. Op het mobo van NSA325 zit ook een seriele poort, maar deze kun je niet zomaar aansluiten op je slimme meter. Er zit al een daemon op deze poort geconfigureerd, die heb je nodig als je hardware reset wilt doen. Deze zou je wel kunnen stoppen lijkt me, maar belangrijkste is dat RXD pin geinvert is. Dit kun je niet software matig wijzigen, dus zou je toch weer een los stukje hardware moeten maken. Via een FTDI kabel kun je dit makkelijk wijzigen, dit heeft Maarten Dam al uitvoerig beschreven:
http://www.maartendamen.c...ndis-gyr-gasmeter-e06140/

Om te testen of je kabel goed is, zou ik deze eerst via putty (Baudrate 9600, databits 7, parity even, stopbits 1) een verbinding maken met de slimmemeter. Als je kabel goed is, dan moet je elke 10 seconden een “telegram” van je slimmemeter ontvangen met daarin de standen. Je kan nu de kabel in je nas steken. Ik heb hem in een USB2 poort gedaan aan de achterkant, geen idee of het wat uitmaakt.

De volgende stap is om de kabel werkend te krijgen op je NAS.
Via putty kun je inloggen op je nas.
Als eerste moet je FFP (Fonz Fun Plugin) installeren:
http://zyxel.nas-central.org/wiki/FFP_as_zypkg

Om toegang te krijgen tot meer linux packages(die hebben we straks nodig), maak ik gebruik van uwsiteloader. De installatie staat hier beschreven:
http://nas-tweaks.net/373...ages-of-the-fun_plug-0-7/
Na de installatie moet je uwsiteloader.sh draaien. Ik heb daar alle repositories aan geklikt.
Daarna moet je het volgende draaien, zodat alle packagelijsten geupdate worden:
slacker -U

Als je nu start: slacker -a
Dan krijg je nu een enorme lijst aan losse packages die kunt installeren op je NAS. Hier zit ook een beetje het probleem, ik heb echt een aantal packages geinstalleerd die misschien niet nodig zijn om de slimmemeter uitlezen of juist wel :). Misschien dat we er samen uitkomen.

Het is belangrijk om packages voor de juiste kernel version te installeren. De kernel versie kun je achterhalen met command: uname -a
Ik heb versie: 2.6.31.8

Installeren de volgende packages via:
slacker -a
mz:kernel_headers-2.6.31.8-arm-1
mz:zyxel_modules-2.6.31.8-arm-4
mz:zyxel_utils-0.4-arm-1
br2:usbutils-007-arm-0
mz:libusb-1.0.9-arm-1
mz:module_utils.1.20.2-arm-1


Als het goed is moet je nu het volgende command kunnen uitvoeren:
modprobe usbserial
modprobe ftdi_sio

Hierdoor wordt het usb device geinstalleerd in /dev.
Na een reboot van de NAS kun het device vinden:
/dev/ttyUSB0

Het laden van de drivers gebeurd bij mij niet automatisch. Dit kan op de volgende manier:
insmod /ffp/lib/modules/2.6.31.8/kernel/drivers/usb/serial/usbserial.ko
insmod /ffp/lib/modules/2.6.31.8/kernel/drivers/usb/serial/ftdi_sio.ko vendor=0x0403 product=0xe0e8

Daarna zou je elke 10 seconden wat onleesbare bagger in je console moeten krijgen met:
cat /dev/ttyUSB0

Bij heb ik de twee insmod commando’s toegevoegd aan het startup script van ffp:
/ffp/start/zyxel_modules.sh
Als iemand weet hoe dit anders moet, dan hoor ik dat graag.

installatie python:
slacker -Uui br2:python/
Installeer de 3 packages.

Installeer daarna de volgende packages:
slacker -ui s:bzip2 s:zlib br2:expat s:gcc-solibs uli:gdbm-1.10 br2:gettext br2:libiconv
slacker -ui br2:libffi br2:ncurses s:openssl br2:readline mz:sqlite-3.7.10 s:uClibc-solibs
slacker -ui s:autoconf s:automake s:binutils s:bison s:flex br2:intltool s:gcc s:gmp s:make-3.81 s:mpfr s:pkg-config s:uClibc

Deze packages hebben we nodig om straks python packages (PIP) te installeren. Die hebben we nodig voor uitlezen van seriele poort en wegschrijven naar mysql.
http://forum.nas-central.org/viewtopic.php?f=249&t=10879

Je kan nu verschillende python packages installeren via PIP, de lijst staat op:
https://pypi.python.org/pypi

pip install pyserial
pip install MySQL-python

Volgens mij moet nu de installatie nu klaar zijn om zelf te gaan stoeien met python en mysql. Ik heb als basis het python script van Ge Jansen gepakt.
http://gejanssen.com/howto/Slimme-meter-uitlezen/

Als je een goed werkend python script hebt, dan kun je die automatisch laten opstarten.
Door een _uitlezen.sh file te maken in /ffp/start/.
De scripts worden descending op naam gestart, dus filenaam met _ laten beginnen.
Zet het volgende commando erin:
/ffp/bin/nohup python /i-data/md0/admin/slimmemeter/P1uitlezer.py &
Op deze manier wordt het process op de achtergrond gestart.
Veel succes ermee!


Voorbeeld script:
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
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/usr/bin/env python
#
# DSMR P1 uitlezer

versie = "1.0"
import sys
import serial
import MySQLdb as mdb

################
#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



#Main program
print ("DSMR P1 uitlezer",  versie)

#Set COM port config
ser = serial.Serial()
ser.baudrate = 9600
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)      


#Initialize
# stack is mijn list met de 20 regeltjes.
p1_teller=0
stack=[]

while p1_teller < 20:
    p1_line=''
#Read 1 line
    try:
        p1_raw = ser.readline()
    except:
        sys.exit ("Seriele poort %s kan niet gelezen worden. Programma afgebroken." % ser.name )      
    p1_str=str(p1_raw)
    p1_line=p1_str.strip()
    stack.append(p1_line)
# als je alles wil zien moet je de volgende line uncommenten
#    print (p1_line)
    p1_teller = p1_teller +1

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

    
    
#Initialize
# stack_teller is mijn tellertje voor de 20 weer door te lopen. Waarschijnlijk mag ik die p1_teller ook gebruiken
stack_teller=0
daldag=00000.000
dalpiek=00000.000
dalterug=00000.000
piekterug=00000.000
verbruik=0
terug=0
gas=00000.000

while stack_teller < 20:
    if stack[stack_teller][0:9] == "1-0:1.8.1":
        print "daldag     ", float(stack[stack_teller][10:19])
        daldag = float(stack[stack_teller][10:19])
    elif stack[stack_teller][0:9] == "1-0:1.8.2":
        print "piekdag    ", float(stack[stack_teller][10:19])
        dalpiek = float(stack[stack_teller][10:19])
# Daltarief, teruggeleverd vermogen 1-0:2.8.1
    elif stack[stack_teller][0:9] == "1-0:2.8.1":
        print "dalterug   ", float(stack[stack_teller][10:19])
        dalterug = float(stack[stack_teller][10:19])
# Piek tarief, teruggeleverd vermogen 1-0:2.8.2
    elif stack[stack_teller][0:9] == "1-0:2.8.2":
        print "piekterug  ", float(stack[stack_teller][10:19])
        piekterug = float(stack[stack_teller][10:19])
# Huidige stroomafname: 1-0:1.7.0
    elif stack[stack_teller][0:9] == "1-0:1.7.0":
        print "afgenomen vermogen      ", int(float(stack[stack_teller][10:17])*1000), " W"
        verbruik = int(float(stack[stack_teller][10:17])*1000)
# Huidig teruggeleverd vermogen: 1-0:1.7.0
    elif stack[stack_teller][0:9] == "1-0:2.7.0":
        print "teruggeleverd vermogen  ", int(float(stack[stack_teller][10:17])*1000), " W"
        terug = int(float(stack[stack_teller][10:17])*1000)
# Gasmeter: 0-1:24.3.0
    elif stack[stack_teller][0:10] == "0-1:24.3.0":
        print "Gas                     ", float(stack[stack_teller+1][1:10]), " m3"
        gas = float(stack[stack_teller+1][1:10])
    else:
        pass
    stack_teller = stack_teller +1

#print (stack, "\n")

try:
    con = mdb.connect('localhost', 'root', 'password', 'slimmemeter')
    with con:
        cur = con.cursor()
        cur.execute("SET GLOBAL time_zone = '+2:00';") #set correct timezone, +1 wintertijd, +2 zomertijd
        cur.execute("INSERT INTO meterstanden \
        (datetime,t1afgenomen,t2afgenomen,t1terug,t2terug,gasafgenomen,huidig_verbruik,huidig_teruglever)\
        VALUES(SYSDATE(),%s,%s,%s,%s,%s,%s,%s)",(daldag,dalpiek,dalterug,piekterug,gas,verbruik,terug,))


except mdb.Error, e:
    print "Error %d: %s" % (e.args[0], e.args[1])
    sys.exit(1)

finally:
    if con:
        con.close()

Acties:
  • 0 Henk 'm!

  • nbch
  • Registratie: November 2005
  • Laatst online: 04-09 22:48
Bedankt voor je uitgebreide beschrijving, ik heb gedeeltes goed kunnen gebruiken in mijn situatie. In plaats van wegschrijven naar een database heb ik er voor gekozen om Domoticz op de NSA325 te laten draaien. Dit is mede met hulp van een ander forum gelukt en draait stabiel.

Acties:
  • 0 Henk 'm!

  • cobike
  • Registratie: December 2000
  • Laatst online: 12-09 07:49
Fijn dat je er wat aan gehad hebt!
Jij ook bedankt voor jouw link, ik ga daar ook even naar kijken!