Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Lokal lesing av HAN - The Easy Way (TM)


Anbefalte innlegg

På 20.4.2018 den 10.25, daniel.h.iversen skrev:

Jeg har en kraftig regnemaskin i boden like ved sikringsskapet som jeg bruker. 
Men ser ikke noen grunn til at det ikke skal gå på en rpi.
Skriving til database og til mqtt skjer async

Jeg gjorde et forsøk på å denne koden til å kjøre på en pi (raspbian), men det gikk ikke (dvs. etter noen timers prøving). Får ikke installert alle Python-pakkene på kompatibelt vis. Men ved å ta bort sqlite-logging, og å bruke et virtualenv med Python 3.5, så fikk jeg scriptet til å rulle. Fikk dog kun ut instantaneffekt.

 

(koden ligger på https://github.com/Danielhiversen/AMSreader)

Lenke til kommentar
Del på andre sider

BKK har endelig (etter et halvår) klart å aktivere min HAN-port, og Pi'en som har ligget klar har endelig fått noe å gjøre på.

 

Jeg er egentlig fornøyd med output som kommer fra test_rx programmet (JSON), og lagde da heller en Python-wrapper som kjører test_rx som en subprosess, og som sender dataene videre over MQTT. Følgende Python-kode trengtes da:

import subprocess
import paho.mqtt.client as mqtt
import json

# If the binary is still active for some reason, kill it
subprocess.call("killall test_rx >/dev/null", shell=True)

proc = subprocess.Popen(['./test_rx'], stdout=subprocess.PIPE)

def on_connect(client, userdata, flags, rc):
    pass

def on_disconnect(client, userdata, rc=0):
    sys.exit(1)

client = mqtt.Client()
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.connect('mqttserver', 1883)


cumulativejson = ''
try:
    for line in iter(proc.stdout.readline, ''):
        line = line.rstrip()
        cumulativejson += line
        if line[-1:] == '}':
            print cumulativejson
            try:
                print json.loads(cumulativejson)
                client.publish('ams', cumulativejson)
                cumulativejson = ''
            except UnicodeDecodeError:
                # Sometimes we get something strange
                # on the serial line, just ignore it.
                cumulativejson = ''
                continue
except Exception:
    proc.terminate() 
    sys.exit(1)
    # Let systemd restart us

For at PI'en skal restarte prosessen hvis noe feil skjer, og etter reboot har jeg følgende i /etc/systemd/system/ams2mqtt.service:

[Unit] 
Description=start and stop the ams2mqtt service

[Service]
WorkingDirectory=/home/pi/han-port-1.14
User=pi
Group=pi
Restart=always
RestartSec=2
ExecStart=/usr/bin/python /home/pi/han-port-1.14/test_rx2mqtt.py


[Install]
WantedBy=multi-user.target
Alias=ams2mqtt.service

Så må man kjøre 'sudo systemctl enable ams2mqtt' for å aktivere denne

 

For å sende tallene videre fra MQTT inn i en OpenHAB item bruker jeg dette i en *items fil:

Number AMSpower "Strømforbruk instantant [%.0f W]" (Offlinewarning, Watt) {mqtt="<[mqttserver:ams:state:JSONPATH($.Act_Pow_P_Q1_Q4)]", expire="10s"}
Number AMS_volt_L1 {mqtt="<[mqttserver:ams:state:JSONPATH($.Volt_L1):.*Volt_L1.*]"}
Number AMS_volt_L2 {mqtt="<[mqttserver:ams:state:JSONPATH($.Volt_L2):.*Volt_L2.*]"}
Number AMS_volt_L3 {mqtt="<[mqttserver:ams:state:JSONPATH($.Volt_L3):.*Volt_L3.*]"}
Number AMS_cumulative_Wh {mqtt="<[mqttserver:ams:state:JSONPATH($.Act_Energy_P):.*Act_Energy_P.*]"}
Number AMS_Reactive_Q3Q4 {mqtt="<[mqttserver:ams:state:JSONPATH($.React_Pow_M_Q3_Q4):.*React_Pow.*]"}
Number AMS_Reactive_Q1Q2 {mqtt="<[mqttserver:ams:state:JSONPATH($.React_Pow_P_Q1_Q2):.*React_Pow.*]"}

 

Endret av berland
robustifisering av koden + kumulativt forbruk
  • Like 1
Lenke til kommentar
Del på andre sider

  • 3 uker senere...
On 8/8/2018 at 20:20, berland said:

Jeg er egentlig fornøyd med output som kommer fra test_rx programmet (JSON), og lagde da heller en Python-wrapper som kjører test_rx som en subprosess, og som sender dataene videre over MQTT. Følgende Python-kode trengtes da:

 

Veldig fin og oversiktlig kode :) 

Har du hatt noe problemer med stdout.readline i programmet ditt?  Jeg opplever at det av og til henger seg for min kode ved oppstart.

Lenke til kommentar
Del på andre sider

8 timer siden, Liabjørn skrev:

 

Veldig fin og oversiktlig kode :) 

Har du hatt noe problemer med stdout.readline i programmet ditt?  Jeg opplever at det av og til henger seg for min kode ved oppstart.

Ikke sett det problemet. Jeg vil gjette på at det er test_rx som henger i de tilfellene.

  • Like 1
Lenke til kommentar
Del på andre sider

readline er vel blocking, så det er ikke rart om den henger :)

Prøv https://docs.python.org/3/library/queue.html#queue.Queue.get_nowait

 

import sys
from subprocess import PIPE, Popen
from threading  import Thread

try:
    from queue import Queue, Empty
except ImportError:
    from Queue import Queue, Empty  # python 2.x

ON_POSIX = 'posix' in sys.builtin_module_names

def enqueue_output(out, queue):
    for line in iter(out.readline, b''):
        queue.put(line)
    out.close()

p = Popen(['myprogram.exe'], stdout=PIPE, bufsize=1, close_fds=ON_POSIX)
q = Queue()
t = Thread(target=enqueue_output, args=(p.stdout, q))
t.daemon = True # thread dies with the program
t.start()

# ... do other things here

# read line without blocking
try:  line = q.get_nowait() # or q.get(timeout=.1)
except Empty:
    print('no output yet')
else: # got line
    # ... do something with line

Som foreslått her: https://stackoverflow.com/questions/375427/non-blocking-read-on-a-subprocess-pipe-in-python

  • Like 1
Lenke til kommentar
Del på andre sider

Hei!

 

Jeg driver og tester med en https://www.aliexpress.com/item/Freeshipping-USB-to-MBUS-slave-module-discrete-component-non-TSS721-circuit-M-BUS-bus-data-monitor/32814808312.html?spm=a2g0s.9042311.0.0.27424c4dLTipJ3

Ser jeg mottar data hvert 10. sekund. Kamstrup måler fra Valdres Energinett. De har bekreftet at HAN-port skal være aktivisert. De gjorde riktignok det før HAN-modul var satt i måler, så det kan være en mulig feilkilde. Dog ser det ut som modulen er passiv og kun konverterer signalet fra måleren til Mbus.

 

Vedlagt er hva jeg ser av data ved bruk av "od -x < /dev/ttyUSB0" og "./test_rx -x -n -d /dev/ttyUSB0 -i" (han-port v1.14)

Utifra hva jeg ser får jeg ikke fullstendige datagram med 7e som start og stop...

2018-09-02 HAN testing 1.rtf

 

Har også prøvd alternative strømkilder på RPi for å eliminere power brownout som mulig feilkilde. 

 

Noen tips?

Lenke til kommentar
Del på andre sider

20 timer siden, BjornA skrev:

Hei!

 

Jeg driver og tester med en https://www.aliexpress.com/item/Freeshipping-USB-to-MBUS-slave-module-discrete-component-non-TSS721-circuit-M-BUS-bus-data-monitor/32814808312.html?spm=a2g0s.9042311.0.0.27424c4dLTipJ3

Ser jeg mottar data hvert 10. sekund. Kamstrup måler fra Valdres Energinett. De har bekreftet at HAN-port skal være aktivisert. De gjorde riktignok det før HAN-modul var satt i måler, så det kan være en mulig feilkilde. Dog ser det ut som modulen er passiv og kun konverterer signalet fra måleren til Mbus.

 

Vedlagt er hva jeg ser av data ved bruk av "od -x < /dev/ttyUSB0" og "./test_rx -x -n -d /dev/ttyUSB0 -i" (han-port v1.14)

Utifra hva jeg ser får jeg ikke fullstendige datagram med 7e som start og stop...

2018-09-02 HAN testing 1.rtf

 

Har også prøvd alternative strømkilder på RPi for å eliminere power brownout som mulig feilkilde. 

 

Noen tips?

 

Prøv å sleng på

-P E

på kommandoen.

Endret av xibriz
Lenke til kommentar
Del på andre sider

Hei jeg hadde samme USB enhet som deg. Som skrevet over her forlangte den even paritet for å gi ut noe signal jeg kunne bruke, dessuten så "mistet den byte" i meldingene som kom. Jeg kjøpte 2 stk og de var var veldig ustabile og med en gang meldingen ble lengre mistet jeg stadig byte på random plasser i meldingen slik at jeg ikke kunne bruke de. Det er flere her som sier deres virker bra, så jeg tror det bare er dårlig/variabel kvalitet. Jeg kjøpte en annen enhet https://www.aliexpress.com/item/USB-transfer-MBUS-module-slave-module-communication-debug-alternative-TSS721/32719562958.html?spm=a2g0s.9042311.0.0.c8314c4dpbv1pv  og den har nå stått og gått et par måneder og virker veldig bra her hos meg. 

Lenke til kommentar
Del på andre sider

På 9.4.2018 den 21.43, frodegill skrev:

For min del kommer jeg, som vanlig, til å lage et REST-endepunkt som en Munin plugin kobler seg opp mot. Ønsker du MQTT bør du nok bruke roarfred sin kode.

 

Jeg får (endelig) AMS-måler på mandag og skal prøve å få koblet opp dette. Kunne du delt koden din? Så får jeg se om den kanskje er like grei å bruke som roarfred sin. :) 

Lenke til kommentar
Del på andre sider

På 9.4.2018 den 21.28, frodegill skrev:

På NodeMCU setter jeg opp RX med "Serial.begin(9600, SERIAL_8N1);  Serial.setDebugOutput(false);", men ender da opp med å måtte bruke Serial1 for debug.

 

Serial1 er vel en annen fysisk tilkobling enn via micro-USB-kontakten? Så man må ha en programmeringskabel og koble seg til på pinnene for å debugge via Serial monitor?

Lenke til kommentar
Del på andre sider

1 hour ago, ZoRaC said:

Kunne du delt koden din? Så får jeg se om den kanskje er like grei å bruke som roarfred sin. :) 

Koden har lagt ute hele tiden. https://github.com/frodegill/ams-han (Jeg holder forøvrig på å gjøre om koden til å pushe til MQTT. Endringene er så fersk at jeg ikke har pushet det til github)

 

1 hour ago, ZoRaC said:

Serial1 er vel en annen fysisk tilkobling enn via micro-USB-kontakten? Så man må ha en programmeringskabel og koble seg til på pinnene for å debugge via Serial monitor?

Velger bare debug-port i ArduinoIDE, og ting funker automagisk...

Lenke til kommentar
Del på andre sider

1 minutt siden, frodegill skrev:

Koden har lagt ute hele tiden. https://github.com/frodegill/ams-han (Jeg holder forøvrig på å gjøre om koden til å pushe til MQTT. Endringene er så fersk at jeg ikke har pushet det til github)

 

Velger bare debug-port i ArduinoIDE, og ting funker automagisk...

 

Supert! :) 

Er det forresten forskjell på polariteten på M-bus? Altså har det noe å si om jeg tar pin1 og 2 til MB A eller MB B?

Lenke til kommentar
Del på andre sider

1 time siden, frodegill skrev:

Jeg har en Aidon fra Hafslund, så det er Aidons standard firmware (altså ikke oppdatert til OBIS ennå)

 

Aha, jeg får Kaifa. Da får jeg vel prøve roarfred sin kode - så vidt jeg har skjønt så gjør kretsen hans det samme som TSS721 og dermed skal fungere uten noen tilpasninger?

Lenke til kommentar
Del på andre sider

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.