Auslesen einer Zeile mit HTTPMOD / Anel Elektronik IP Steckdosen

Begonnen von Groej, 08 Oktober 2016, 07:45:13

Vorheriges Thema - Nächstes Thema

Groej

Juten Tag an alle,

ich habe eine Anel IP Steckdosenleiste. Diese wirft über eine HTML Seite eine Datei mit den Zustand der Steckdosen aus und noch einiges mehr. Ich bekomm es zwar hin die Datei mit FHEM abzuholen und seh sie auch im Buffer des HTTPMOD Device aber bekomme es nicht hin den Zustand einer gezielten Steckdose auszulesen.

Die ausgelesen Datei sieht wie folgt aus:

NET-PWRCTRL_04.0;NET-CNTRL_BLN  ;192.168.10.4;255.255.255.0;192.168.10.1;00:04:A3:0B:04:3F;80;33.1;P;;Diskstation;HD Backup;IPO-Srv;AP 4.OG;Router;VDSL Modem;Nr7;Fritz!Box;;;1;0;0;0;1;1;0;0;;;0;0;0;0;0;0;0;0;;;an nach dem Start;Anfangsstatus;Anfangsstatus;Anfangsstatus;an vom Timer;an nach dem Start;aus vom Programm;aus vom Programm;;;;;;;T;;;;end;NEt-Cntrl Bln 4.OG Flur

Das grün gekennzeichnete sind die Zustände der 8 Steckdosen. In diesen Fall ist 1,5 und 6 eingeschaltet.  Meine Frage ist nun wie bekomme ich es hin die Zustände für jede Dose in einen eigenen Device auszulesen und mir dadurch den Zustand in FHEM anzeigen zu lassen. Es geht bestimmt mit readingName und readingRegex aber irgendwie stell ich mich zu blöd an weil davor so viel anderes steht. Meine Idee wäre die Semikolons zu zählen und den Wert danach auszulesen aber ich weiß nicht wie.

Danke schon mal für Tipps bzw. Hilfe von Euch.

Gruß

Jörg
FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

Groej

#1
Moin,

habs jetzt hinbekommen allerdings hab ich noch einen Schönheitsfehler.  Ich lese damit alle Zahlen aus und bekomme eine Anzahl von Values als Ausgabe. Dann nehme ich das Value was ich brauch. Teile des Codes habe ich hier gefunden https://forum.fhem.de/index.php/topic,30477.msg498508.html#msg498508. Falls jemand zu dem Code noch ein Verbesserungsvorschlag hat immer her damit.

Hier erst mal der Code mit dem es klappt:

define anel_bln_rel7 HTTPMOD http://192.168.10.4/strg.cfg?Auth:udpudp 10
attr anel_bln_rel7 userattr reading01AutoNumLen reading01Name reading01RegOpt reading01Regex set1Data set1Name setHeader setURL
attr anel_bln_rel7 alias Anel Bln Power Nr.7
attr anel_bln_rel7 devStateIcon 1:taster_ch_an_gruen 0:taster_ch_aus_rot
attr anel_bln_rel7 reading01AutoNumLen 2
attr anel_bln_rel7 reading01Name value
attr anel_bln_rel7 reading01RegOpt g
attr anel_bln_rel7 reading01Regex (?:\d*\.)?\d+
attr anel_bln_rel7 room Power Control
attr anel_bln_rel7 set1Data F6=T
attr anel_bln_rel7 set1Name an/aus
attr anel_bln_rel7 setHeader Content-Type: text/html
attr anel_bln_rel7 setURL http://192.168.10.4/ctrl.htm?Auth:udpudp
attr anel_bln_rel7 stateFormat value-29
attr anel_bln_rel7 timeout 5
attr anel_bln_rel7 verbose 0
attr anel_bln_rel7 webCmd an/aus 0


Nun aber zu meinen Schönheitsfehler. Ich hätte gern FHEM Frontend nur das Icon zum schalten und nicht das an/aus 0 noch daneben. Wenn ich die 0 wegnehme geht das schalten gar nicht (siehe Dateianhang).

Jemand einen Tipp für mich wie ich das weg bekomme?

Gruß und schönen Sonntag

Jörg

FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

Masterciw

Guten Abend,

bin neu hier und kämpfe gerade mit dem gleichen Thema rum. Habe gestern mit dem Thema FHEM angefangen und noch nicht viel Erfahrung sammeln können.
Bin gerade noch bei der Findung was ich alles mit FHEM realisieren kann.

Meine Fritzbox und mein LibreElec Mediacenter konnte ich anhand der vielen Tutorials schon erfolgreich einbinden. Mangels des bestellten Busware Culs habe ich noch nicht meine diversen Intertechno Steckdosen angebunden.

Ich bin im Besitz einer Anel Net Power Control mit 8 schaltbaren Steckdosen. Diese habe ich nun soweit auch unter FHEM eingebunden.
Problem dabei ist das ich zwar die einzelnen Steckdosen schalten kann, aber keinen Status unter FHEM zurückgeliefert bekomme.

Da ich sowohl für Linux ein Bash Script für das Schalten als auch unter Powershell für Windows ein Script erstellt habe, in dem ich auch den Status auslese, sollte es doch auch unter FHEM realisierbar sein.

Kenne mich aber mit Regular Expressions nicht sonderlich aus. Suche nun jemand, der für oben genannten String eine Regular Expression erstellt.
Diese sollte den Wert hinter dem 20 Semikolon zurückliefern (das müßte meiner Meinung nach der Status der ersten Steckdose sein.)

Vielen Dank für Eure Hilfe.

Groej

Hallo Masterciw,

ich hab mir das auch nur aus Einträgen und selber gefummel zusammengebastelt. Hier der Code als Beispiel für Dose Nr.7. Der Haken bei meiner Lösung ist das er nicht die Semikolons zählt (hab ich leider nicht gefunden wie es geht) sondern auf Zahlen und diese einzeln als Values ausgibt. Wenn Du also den Namen der Dosen irgendwie änderst verschieben sich die Values dementsprechend. Im Beispiel ist Value 29 Dose 7. Das ganze ist mit Status auslesen im FHEM. Kann aber bis zu 10 Sekunden dauern bist der Status im FHEM geändert wird.

Wie gesagt falls es Verbesserungsvorschläge gibt immer her damit.

define anel_bln_rel7 HTTPMOD http://192.168.10.4/strg.cfg?Auth:udpudp 10
attr anel_bln_rel7 userattr reading07AutoNumLen reading07Name reading07RegOpt reading07Regex set1Data set1Name setHeader setURL
attr anel_bln_rel7 alias Anel Berlin Dose Nr.7
attr anel_bln_rel7 reading07AutoNumLen 2
attr anel_bln_rel7 reading07Name value
attr anel_bln_rel7 reading07RegOpt g
attr anel_bln_rel7 reading07Regex (?:\d*\.)?\d+
attr anel_bln_rel7 set1Data F6=T
attr anel_bln_rel7 set1Name an/aus
attr anel_bln_rel7 setHeader Content-Type: text/html
attr anel_bln_rel7 setURL http://192.168.10.4/ctrl.htm?Auth:udpudp
attr anel_bln_rel7 stateFormat value-29
attr anel_bln_rel7 timeout 5
attr anel_bln_rel7 verbose 0
attr anel_bln_rel7 webCmd an/aus 0

define anel_bln_rel7_dummy dummy
attr anel_bln_rel7_dummy alias Dose 7
attr anel_bln_rel7_dummy devStateIcon on:taster_ch_an_gruen:off off:taster_ch_aus_rot:on
attr anel_bln_rel7_dummy group Anel Berlin
attr anel_bln_rel7_dummy room Power Control
attr anel_bln_rel7_dummy setList state:on,off
attr anel_bln_rel7_dummy webCmd :
define anel_bln_rel7_on DOIF ([anel_bln_rel7_dummy] eq "on" and [anel_bln_rel7:value-29] eq "0") (set anel_bln_rel7 an/aus 1)
define anel_bln_rel7_off DOIF ([anel_bln_rel7_dummy] eq "off" and [anel_bln_rel7:value-29] eq "1") (set anel_bln_rel7 an/aus 0)
define anel_bln_rel7_dummy_on_doif DOIF ([anel_bln_rel7:value-29] eq "1") (set anel_bln_rel7_dummy on)
define anel_bln_rel7_dummy_off_doif DOIF ([anel_bln_rel7:value-29] eq "0") (set anel_bln_rel7_dummy off)
FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

Nobby1805

FHEM-Featurelevel: 6.2   (fhem.pl:28227/2023-11-29) auf Windows 10 Pro mit Strawberry Perl 5.32.1.1-32bit
TabletUI: 2.7.15
IO: 2xHMLAN(0.965)|HMUSB2(0.967)

Groej

Hallo Nobby1805,

danke für den Tipp und auf der Seite geht es auch aber FHEM möchte das so nicht schlucken.

Invalid Regex ^(?:[^ Unknown command ]*, try help. Unknown command ){26}([^, try help. Unknown command ]*), try help.

Da fehlen bestimmt Zeichen davor und dahinter. Weiß nur nicht welche leider.

Gruß

Jörg
FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

Nobby1805

Versuch doch mal die Semikola zu escapen ... da deutet m.E. die Fehlermeldung hin
FHEM-Featurelevel: 6.2   (fhem.pl:28227/2023-11-29) auf Windows 10 Pro mit Strawberry Perl 5.32.1.1-32bit
TabletUI: 2.7.15
IO: 2xHMLAN(0.965)|HMUSB2(0.967)

Masterciw

Hallo Nobby1805 und Groej,

vielen lieben Dank für die prompte Antwort.

@ Nobby1805: Meinst Du mit escapen den folgenden Aufruf: ^(?:[^\;]*\;){19}([^\;]*);     ?
Was liefert er mir dann genau als Ergebnis zurück. Den Rest des Stringes oder nur den Zustand 0 oder 1 bis zum nächsten Semikolon?

Mit RegEx stehe ich leider ein wenig auf Kriegsfuss. In Powershell habe ich den String in ein Array gesplittet und als Trenner das Semikolon verwendet.
Dann habe ich einfach den richtigen Teilstring ausgelesen und fertig.

@ Groej: Meinst Du mit Namen der Dosen ändern, den Namen im Webinterface der Steckdosenleiste?
Das wäre fatal.

Würde im FHEM auch gerne den Namen der Steckdose per RegEx auslesen und diesen dann z.B als Alias im Webinterface anzeigen.
Ist das machbar?

Vielen Dank für Eure Hilfe


Nobby1805

Zitat von: Masterciw am 12 Dezember 2016, 21:41:38
@ Nobby1805: Meinst Du mit escapen den folgenden Aufruf: ^(?:[^\;]*\;){19}([^\;]*);     ?
Was liefert er mir dann genau als Ergebnis zurück. Den Rest des Stringes oder nur den Zustand 0 oder 1 bis zum nächsten Semikolon?
wobei das ;) für Semikolon und Klammer zu steht (wie kann man dort das Smiley verhindern?) ... ja, das Ergebnis ist der Zustand bin zum nächsten Semikolon (ausschließlich)
FHEM-Featurelevel: 6.2   (fhem.pl:28227/2023-11-29) auf Windows 10 Pro mit Strawberry Perl 5.32.1.1-32bit
TabletUI: 2.7.15
IO: 2xHMLAN(0.965)|HMUSB2(0.967)

Groej

Hallo Nobby1805,

hab schon probiert mit einen ; abzuschließen aber klappt auch nicht. FHEM scheint ein Problem mit dem ^ zu haben. Jemand eine Idee dazu?

@Masterciw: Wenn das mit dem String von Nobby funktioniert gibts kein Problem mehr wenn Du die Namen der Dosen im Webinterface änderst. Das mit den Namen auslesen sollte dann auch klappen. Ich weiß nur nicht ob man den Aliasnamen des Device durch eine Variable ersetzen kann aber warum eigentlich nicht.

Gruß

Jörg
FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

Masterciw

Hallo Leidgenossen,

was Regex angeht bin ich trotz mehrerer Stunden Test leider nicht weitergekommen. Werde mich Morgen nochmals dahinterklemmen.
Habe noch eine andere Webseite zum Testen gefunden. Hier wird wenn man auf der linken Seite explain anklickt auch der RegEx Ausdruck aufgeschlüsselt.

Hier der Link:
http://chris.photobooks.com/regex/default.htm

Dort funktioniert der RegEx von Nooby ohne Probleme.

Was mir auch noch aufgefallen ist sind die 4 Semikolons vor dem Schaltzustand der ersten Steckdose. Vielleicht kann man diese nutzen und den RegEx dementsprechend anpassen.

@ Nooby: Hast Du eine Ideee dazu?

@ Groej: das wäre super wenn wir das in den Griff kriegen würden. Vor allem muss man dann nicht immer darüber nachdenken um welche Stelle es sich handelt.

Mal sehen wie weit wir kommen.

Gute Nacht noch.

Masterciw

frank

Zitataber FHEM möchte das so nicht schlucken.
wo? in der befehlszeile von fhem?

dieses problem hatte ich zumindestens die letzten tage beim setzen von httpmod attributen.
bei mir klappt es wie folgt:
beim eingeben über die befehlszeile meckert fhem, aber setzt trotzdem ein "verstümmeltes" attribut. dieses kann ich dann aber über attribut ändern auf der detailseite des httpmod devices nach belieben ändern. hier wird nicht mehr "gemeckert". bei mir waren es wohl auch immer semicolon's.

eventuell hilft auch ein verdoppeln eines semicolon in der befehlszeile.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Masterciw

Hallo,

hab noch nicht aufgegeben. In der Zwischenzeit habe ich folgendes ausprobiert: Der RegEx String ^(?:[^\;]*\;){19}([^\;]*);
ist soweit richtig, aber dieser funktioniert scheinbar nicht korrekt in Perl. Daher suche ich jemand, der den auf Perl anpassen kann.

Wenn sich jemand mit RegEx unter FHEM auskennt würde ich mich freuen wenn er einen Blick darauf schmeissen würde.

@Groej: Dieser blöde RegEx ist momentan der Showstopper schlecht hin. Würde gerne die Steckdose nutzen. Wäre es Dir möglich mir den kompletten Source für die Steckose per PN zu schicken, so dass ich diese erst mal so verwenden kann. Auch eine kurze Erklärung mit der Zahlweise wäre nicht schlecht. Habe gestern mal versucht herauszufinden wie du da zählst, stehe da aber vollkommen auf dem Schlauch. Hast Du zusätzlich noch eine Funktion in der 99_myUtils.pm hinterlegt?
Vielen Dank

Was den RegEx String angeht setze ich nach dem Urlaub meinen Kollegen darauf an. Der kennt sich unter Linux sehr gut aus und hat mir auch bei der Erstellung eines Bashscriptes zum Schalten geholfen.

Unter Powershell hatte ich das Ganze anders realisiert. Da habe ich den gesamten String in ein Array gesplitted und als Trenner das Semikolon verwendet. Das Ganze dann in einer Zählerschleife durchlaufen und schon hatte ich den Status der 8 Steckdosen

@frank: Ein Verdoppeln der Semikolons hat bei meinen Tests nichts gebracht. Habe diese aber direkt in der cfg Datei gesetzt und nicht über die FHEM Befehlszeile.

Das sind erst mal meine neusten Erkenntnisse dazu.

Gute Nacht noch

Masterciw

Groej

#13
Moin,

ich glaub ich habs. Also bis jetzt funktioniert es anscheinend.

define anel_bln_rel7 HTTPMOD http://192.168.10.4/strg.cfg?Auth:udpudp 8
attr anel_bln_rel7 userattr reading07Name reading07RegOpt reading07Regex reading08Name reading08RegOpt reading08Regex set1Data set1Name setHeader setURL
attr anel_bln_rel7 alias Anel Berlin Dose Nr.7
attr anel_bln_rel7 reading07Name value7
attr anel_bln_rel7 reading07RegOpt g
attr anel_bln_rel7 reading07Regex ^(?:[^;;]*;;){26}([^;;]*);;
attr anel_bln_rel7 reading08Name value8
attr anel_bln_rel7 reading08RegOpt g
attr anel_bln_rel7 reading08Regex ^(?:[^;;]*;;){27}([^;;]*);;
attr anel_bln_rel7 set1Data F6=T
attr anel_bln_rel7 set1Name an/aus
attr anel_bln_rel7 setHeader Content-Type: text/html
attr anel_bln_rel7 setURL http://192.168.10.4/ctrl.htm?Auth:udpudp
attr anel_bln_rel7 stateFormat value7
attr anel_bln_rel7 timeout 2
attr anel_bln_rel7 verbose 0
attr anel_bln_rel7 webCmd an/aus 0

define anel_bln_rel7_dummy dummy
attr anel_bln_rel7_dummy alias Dose 7
attr anel_bln_rel7_dummy devStateIcon on:taster_ch_an_gruen:off off:taster_ch_aus_rot:on
attr anel_bln_rel7_dummy group Anel Berlin
attr anel_bln_rel7_dummy room Power Control
attr anel_bln_rel7_dummy setList state:on,off
attr anel_bln_rel7_dummy webCmd :
define anel_bln_rel7_on DOIF ([anel_bln_rel7_dummy] eq "on" and [anel_bln_rel7:value7] eq "0") (set anel_bln_rel7 an/aus 1)
define anel_bln_rel7_off DOIF ([anel_bln_rel7_dummy] eq "off" and [anel_bln_rel7:value7] eq "1") (set anel_bln_rel7 an/aus 0)
define anel_bln_rel7_dummy_on_doif DOIF ([anel_bln_rel7:value7] eq "1") (set anel_bln_rel7_dummy on)
define anel_bln_rel7_dummy_off_doif DOIF ([anel_bln_rel7:value7] eq "0") (set anel_bln_rel7_dummy off)

define anel_bln_rel8 HTTPMOD http://192.168.10.4/strg.cfg?Auth:udpudp 0
attr anel_bln_rel8 userattr reading08Name reading08RegOpt reading08Regex set1Data set1Name setHeader setURL
attr anel_bln_rel8 alias Anel Berlin Dose Nr.8
attr anel_bln_rel8 reading08Name value8
attr anel_bln_rel8 reading08RegOpt g
attr anel_bln_rel8 reading08Regex ^(?:[^;;]*;;){27}([^;;]*);;
attr anel_bln_rel8 set1Data F7=T
attr anel_bln_rel8 set1Name an/aus
attr anel_bln_rel8 setHeader Content-Type: text/html
attr anel_bln_rel8 setURL http://192.168.10.4/ctrl.htm?Auth:udpudp
attr anel_bln_rel8 stateFormat value8
attr anel_bln_rel8 timeout 2
attr anel_bln_rel8 verbose 0
attr anel_bln_rel8 webCmd an/aus 0

define anel_bln_rel8_dummy dummy
attr anel_bln_rel8_dummy alias Dose 8
attr anel_bln_rel8_dummy devStateIcon on:taster_ch_an_gruen:off off:taster_ch_aus_rot:on
attr anel_bln_rel8_dummy group Anel Berlin
attr anel_bln_rel8_dummy room Power Control
attr anel_bln_rel8_dummy setList state:on,off
attr anel_bln_rel8_dummy webCmd :
define anel_bln_rel8_on DOIF ([anel_bln_rel8_dummy] eq "on" and [anel_bln_rel7:value8] eq "0") (set anel_bln_rel8 an/aus 1)
define anel_bln_rel8_off DOIF ([anel_bln_rel8_dummy] eq "off" and [anel_bln_rel7:value8] eq "1") (set anel_bln_rel8 an/aus 0)
define anel_bln_rel8_dummy_on_doif DOIF ([anel_bln_rel7:value8] eq "1") (set anel_bln_rel8_dummy on)
define anel_bln_rel8_dummy_off_doif DOIF ([anel_bln_rel7:value8] eq "0") (set anel_bln_rel8_dummy off)


Kurze oder vielleicht auch lange Erklärung. Ich hab zum Test nur Dose 7 und 8 hier weil da nichts dran ist bei mir.
Ich lese über Dose 7 alle Ports aus ( im Beispiel jetzt nur Dose 7 und 8 ) alle 8 Sekunden. Damit werden die Values 7 und 8 erzeugt. Dann gibt es die DOIF Anweisungen um in FHEMWeb die Schalter zu schalten bzw. damit ja auch den Status der jeweiligen Dose. Ich mach das auslesen so weil ich nicht möchte das ständig die Dose bzw. der RasPi beschäftigt werden. Genauso ist eine Ruhezeit von 2 Sekunden programmiert damit die Dose nicht ständig Befehle bekommt. Mit set1Data F6=T wird die Dose 7 dann geschaltet. Bei Dose 8 ist es set1Data F7=T usw.. Hab bei der Aktion gemerkt das sich das WebUI der Leiste beim schalten über FHEM nicht immer selbst aktualisiert. Das auslesen passiert jetzt an Hand der Semikolons. Kann man ganz oben am den String auszählen bzw. nachvollziehen.

Die Idee mit den Namen auslesen und in den Alias zu setzten finde ich super. Ich kann auch schon die Namen auslesen aber nicht als Alias setzten. Ich hab dazu mal ein Thema hier im Forum aufgemacht.
https://forum.fhem.de/index.php/topic,62684.0.html

Ich bin nicht der große Programmierer daher die Bitte wenn was besser geht bzw. einfacher zu lösen ist einfach schreiben.

Gruß

Jörg
FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

Masterciw

Hallo,

der RegEx funktioniert super. Kann nun alle States auslesen und auch die Namen lassen sich in Variablen einlesen.
Was mir zu schaffen machte war der Timeout von 2 Sekunden. Scheinbar dauert es länger bis der HTTP Request durch ist
und daher wurde der Buffer nicht komplett gefüllt. Nachdem ich den Timeout deaktivert habe war alles gut.

Was das Auslesen und setzen von Variablen angeht habe ich folgenden Link gefunden. Hatte aber noch keine Zeit mehr zu testen:
http://www.computerhilfen.de/info/fhem-vordefinierte-variablen-nutzen-oder-eigene-definieren.html

Morgen werde ich mich mal daran machen und schauen ob ich dann die Steckdosen mit Status schalten kann.

Gute Nacht.