Tibber-Livestream lokal auslesen

Begonnen von gvzdus, 26 April 2023, 23:45:29

Vorheriges Thema - Nächstes Thema

gvzdus

Verstehe ich auch so: Vermutlich ist ja die Tibber Bridge bei ihm (Dir) schon auf "Dauer-HTTP-Server" eingestellt. Also einfach beim 2. Block aus Beitrag #1 weitermachen - dem Test - und fertig.
Irgendein Zusatzmodul im Docker-Container brauchst Du nicht, das macht das OBIS-Modul gleich mit.

dennisk

Hallo @xerion,@gvzdus,

danke für eure Rückmeldungen. Ihr habt natürlich recht, es geht auch mittels des vorgeschlagenen Pollings. Mich stört daran nur, dass das eigentlich für diese Zwecke vorgesehene Messaging-Protokoll MQTT dann nicht verwendet wird und ich den Tibber noch zusätzlich mit einem Polling belaste. Theoretisch ließe sich der Webserver auf dem verbauten ESP32 dann auch wieder abschalten bzw. wieder so einstellen, dass er eben nur gestartet wird, wenn die Tibber Bridge im AP-Modus hochfährt. Und ich könnte mir vorstellen, dass der Use Case auch für die diversen ESP-Selbstbau-Leseköpfe mit Tasmota eine Alternative sein könnte, d.h. ich kann die SML-Auswertung dem OBIS-Modul überlassen und benötige kein entsprechendes Skript mehr für die Tasmota-basierte Auswertung. Ich hoffe, das macht es ein wenig klarer?

gvzdus

Ja, jetzt verstanden :-)
Du hast also die Variante "MQTT-Proxy-Server" gewählt, und lässt die Bridge den MQTT-Stream nicht direkt in die AWS schicken, sondern über einen lokalen Proxy? Bei der Möglichkeit hätte ich persönlich als Tibber viel mehr dagegen als gegen einen HTTP-Server, weil es die Option zur Datenmanipulation quasi vorbereitet. Aber sei es drum.

Ich habe mal schnell was gebastelt (siehe Anhang), dass Du mit "set <obisdevice> data <sml in hex>" Daten einfüttern kannst. Anbei die Variante. Also:
defmod ot OBIS noneund dann jeweils Hex so einkippen:
set ot OBIS data 1b1b1b1b....1b1b1b1b1a.....
Hilft das? Wie sehen denn die MQTT-Nachrichten aus? Hex oder Binär?

gvzdus

P.S. Kann sein, dass ich mich jetzt völlig verhaue mit der Sichtbarkeit von Modul-Funktionen außerhalb ("Perl-Basics"). ABER:

Du musst eigentlich nur OBIS_Parse mit Hash und den binären Inputdaten aufrufen, dann wird geparsed und in das Device dekodiert. Also nehmen wir mein Beispiel mit einem OBIS-Device "ot". Dann solltest Du in einem Notify, dass auf ein MQTT-Topic triggert, so etwas schreiben können (auch mit dem bestehenden Modul):

define smlprocess notify <MQTT-Device>:<smltopic> { OBIS_Parse (%defs{"ot"}, $EVTPART1) }
oder - bei HEX -

define smlprocess notify <MQTT-Device>:<smltopic> { OBIS_Parse (%defs{"ot"}, (pack 'H*', $EVTPART1) ) }
Vielleicht einen Versuch wert - hier aber ungetestet.

dennisk

Zitat von: gvzdus am 01 Juni 2023, 22:20:47P.S. Kann sein, dass ich mich jetzt völlig verhaue mit der Sichtbarkeit von Modul-Funktionen außerhalb ("Perl-Basics"). ABER:

Vielen Dank für den Vorschlag, hab ich ausprobiert:
defmod obis OBIS none
defmod obis_smlprocess notify MQTT2_TIBBERPULSE:SML:.* { OBIS_Parse (%defs{"obis"}, (pack 'H*', $EVENT) ) }
Hinter SML musste ich noch :.* ergänzen, sonst hat das notify erst gar nicht ausgelöst. Leider erhalte ich damit aber keine Readings im OBIS device, sondern diesen Fehler:
PERL WARNING: %defs{"obis"} in scalar context better written as $defs{"obis"} at (eval 1540542) line 1.
2023.06.02 17:31:04 3: eval: my $EVENT=  $evalSpecials->{'%EVENT'};my $EVTPART0=  $evalSpecials->{'%EVTPART0'};my $EVTPART1=  $evalSpecials->{'%EVTPART1'};my $EVTPART10=  $evalSpecials->{'%EVTPART10'};my $EVTPART11=  $evalSpecials->{'%EVTPART11'};my $EVTPART12=  $evalSpecials->{'%EVTPART12'};my $EVTPART13=  $evalSpecials->{'%EVTPART13'};my $EVTPART14=  $evalSpecials->{'%EVTPART14'};my $EVTPART15=  $evalSpecials->{'%EVTPART15'};my $EVTPART16=  $evalSpecials->{'%EVTPART16'};my $EVTPART17=  $evalSpecials->{'%EVTPART17'};my $EVTPART18=  $evalSpecials->{'%EVTPART18'};my $EVTPART19=  $evalSpecials->{'%EVTPART19'};my $EVTPART2=  $evalSpecials->{'%EVTPART2'};my $EVTPART20=  $evalSpecials->{'%EVTPART20'};my $EVTPART3=  $evalSpecials->{'%EVTPART3'};my $EVTPART4=  $evalSpecials->{'%EVTPART4'};my $EVTPART5=  $evalSpecials->{'%EVTPART5'};my $EVTPART6=  $evalSpecials->{'%EVTPART6'};my $EVTPART7=  $evalSpecials->{'%EVTPART7'};my $EVTPART8=  $evalSpecials->{'%EVTPART8'};my $EVTPART9=  $evalSpecials->{'%EVTPART9'};my $NAME=  $evalSpecials->{'%NAME'};my $SELF=  $evalSpecials->{'%SELF'};my $TYPE=  $evalSpecials->{'%TYPE'};{ OBIS_Parse (%defs{"obis"}, (pack 'H*', $EVENT) ) }
Wenn ich das Prozentzeichen durch ein Dollar-Zeichen ersetze, dann erhalte ich nur diese Ausgabe:
2023.06.02 17:31:04 3: obis_smlprocess return value: obis

Hab ich für diesen Ansatz noch irgendwas vergessen oder falsch gemacht, oder hängt es tatsächlich mit der Sichtbarkeit der Methode OBIS_Parse, d.h. aus dem notify heraus kann diese gar nicht aufgerufen werden?
Deinen ersten Vorschlag mit der angehängten angepassten Modul-Datei konnte ich noch nicht testen.