Kommunikation: Fritz <-> CCU via Fhem

Begonnen von Dragonfly, 09 Februar 2013, 07:27:55

Vorheriges Thema - Nächstes Thema

Dragonfly

Bei ID kommt "uid=0(root) gid=0(root)" raus.
Alles andere ist FHEM-original.

Ich mach jetzt einfach mal das Image neu rauf und fang nochmal an.

Hast du mit den DECT200-Befehlen was anfangen können?

LG Tom

rudolfkoenig

>  Hast du mit den DECT200-Befehlen was anfangen können?

Nicht direkt, ich versuche gerade mit dem AHA "richtig" zu reden ueber /var/tmp/me_avm_home_external.ctl, der Weg ist aber steinig. Habe gerade gelernt, dass es sowas wie SOCK_SEQPACKET gibt.

Dragonfly

Hallo Rudi, es rennt!!!


Naja, fast.
{ GetFileFromURL("http://192.168.125.70:8181/fhem-2-ccu.exe?Status=dom.GetObject('FB_WLAN').State(1)") }
damit wird der Status problemlos geändert.

Leider geht es noch nicht automatisch.
So sieht mein "WLAN-Block" momentan aus (alles in der fhem.cfg):
define WLAN_STATUS dummy
attr WLAN_STATUS room Fritz!Box
define WLAN_check at +*00:00:30 { fhem "set WLAN_STATUS ".`ctlmgr_ctl r wlan settings/ap_enabled` }
define WLAN_ntfy notify WLAN_STATUS {\
  if(Value("WLAN_STATUS") ne OldValue("WLAN_STATUS") {\
    GetFileFromURL "http://192.168.125.70:8181/fhem-2-ccu.exe?Status=dom.GetObject('FB_WLAN').State(" . Value("WLAN_STATUS")\
  }\
}


Kannst nochmal drüberfliegen - mir kommt vor, daß die Url beim Status nicht passt: State(" . Value("WLAN_STATUS")\
Habe auch schon fleißig Gänsefüßchen verschoben - ändert sich aber nichts.

Dafür habe ich schon überrissen, daß du bei Änderung des Status den Status mitschicken lassen willst!


Danke - hoffentlich ein letztes mal ;-)

rudolfkoenig

> mir kommt vor, daß die Url beim Status nicht passt:

stimmt, unten fehlt 2x Klammer-Zu:

define WLAN_ntfy notify WLAN_STATUS {\
  if(Value("WLAN_STATUS") ne OldValue("WLAN_STATUS")) {\
    GetFileFromURL "http://192.168.125.70:8181/fhem-2-ccu.exe?Status=dom.GetObject('FB_WLAN').State(" . Value("WLAN_STATUS") . ")"\
  }\
}

Dragonfly

Nö, das war´s leider noch nicht!

2013.02.15 13:32:46 1: CustomGetFileFromURL http://192.168.125.70:8181/fhem-2-ccu.exe?Status=dom.GetObject('FB_WLAN').State(0
): malformed or unsupported URL


Wenn ich die Meldung in notepad++ reinkopiere macht er mir einen zeilenumbruch bei .State(0 wie oben.
Kanns das sein oder fehlt die Klammer um die url?


Kann man da auch einfach einen Befehl einpflegen, daß bei Neustart von FHEM die Stati sofort geholt und weiterverschickt werden?
bzw. kann die CCU (z.B. wegen Neustart) die Stati anfordern?


Danke - schon wieder.

rudolfkoenig

Der URL Parser von Martin mag keine Newlines im URL, wir sollten es also entfernen:
define WLAN_check at +*00:05 {\
  my $v=`ctlmgr_ctl r wlan settings/ap_enabled`;;\
  chomp($v);;\
  fhem "set WLAN_STATUS $v";;\
}

> ...Neustart von FHEM die Stati sofort geholt und weiterverschickt werden?

FHEM verschickt ein global:INITIALIZED event nach dem Einlesen der config. Es bietet sich an das at in einem at und ein notify aufzuteilen, um code zu sparen:
define WLAN_check at +*00:05 trigger WLAN_check
define WLAN_STATUS_set notify (WLAN_check|global:INITIALIZED) {\
  my $v=`ctlmgr_ctl r wlan settings/ap_enabled`;;\
  chomp($v);;\
  fhem "set WLAN_STATUS $v";;\
}

So kann man den Status mit einem "manuellen" trigger WLAN_check aktualisieren.
Falls man das in FHEMWEB eingibt, dann kann man sich das \ sparen, und es reicht auch ein ; statt dem ;;

Dragonfly

Ja eh!
Das hätt´ ich als nächstes probiert!

Keine Angst, ich Frage nicht nach unten stehendem...
http://user:pwd@192.168.1.1:8083/fhem?cmd=trigger+WLAN_check;trigger+WLAN5_check
Interessant ist jedoch daß dies im IE nicht geht, im FF schon.....


Rudi - du bist der Größte!!!

PS: Lösch die verhauten Beiträge doch raus...
PPS: Hast noch Geduld für ein weiteres Kapitel? "FHEM - ein Gehirn für die CCU"

EDIT:
Ach Rudi, es tut mir leid - ein/zwei Schönheitsfehler:
* Bei Anforderung muß der Status übertragen werden, es könnte ja sein, daß sich wärend der "Abwesenheit" der CCU was geändert hat (ja die hängt sich schon mal weg).
* Kann man nicht für die IP der CCU eine Variable setzen?! Es können ja leicht bis zu 10 Stati werden, die übertragen werden sollen.
* Auch ein Suff- oder Prä-fix (was weiß ich wie das heißt) für die Systemvariable wäre schön - bei mir heiß sie FB_WLAN, FB_WLAN5 - andere würde sie vielleicht lieber als Fritz-WLAN bezeichnen.

Ich denk ja nicht nur an mich ;-)
Sobald alle Stati bekannt, eingepflegt und geprüft sind lass ich dir das "Werk" zukommen.

Und abermals vielen Dank für deine großartige Unterstützung. Gute Nacht!

rudolfkoenig

> Bei Anforderung muß der Status übertragen werden

trigger WLAN_STATUS

> für die IP der CCU eine Variable setzen?

Da gibt es mehrere Wege:

define CCU_IP dummy
set CCU_IP 192.168.125.70
Verwenden mit:
Value("CCU_IP")

oder

attr WLAN_STATUS comment 192.168.125.70
Verwenden mit:
AttrVal("WLAN_STATUS", "comment", "127.0.0.1")

> Ich denk ja nicht nur an mich ;-)

Dann wird Zeit fuer einen fhemwiki Eintrag.
Anmelden bei den Admins, siehe Neuigkeiten.


Dragonfly

Hallo nochmal, leider wird bei

trigger WLAN_STATUS

weder der status aktuallisiert noch der status übertragen,
es ist aber leider nötig alle stati bei start der ccu zu erneuern.


das andere hab ich hinbekommen (ccu-ip und prefix)


jetzt aber wirklich ein letztes mal - danke.

rudolfkoenig

Der Status sollte aktuell sein, es wird aber nicht versendet, da es sich nicht geaendert hat.
Vorschlag: aus WLAN_ntfy die Pruefung entfernen, und in WLAN_STATUS_set die Zeile
 fhem "set WLAN_STATUS $v";;\
durch
 fhem "set WLAN_STATUS $v" if($v ne Value("WLAN_STATUS");;\
ersetzen.

Dragonfly

trigger WLAN_check wirft nun diesen fehler aus:
WLAN_STATUS_set return value: syntax error at (eval 252) line 1, at EOF

trigger WLAN_STATUS
überträgt sofort den status an die ccu, ohne zu aktualisieren.

Hier nochmal das aktuelle "werk":
define WLAN_STATUS dummy
attr WLAN_STATUS room Fritz!Box
define WLAN_check at +*00:05:00 trigger WLAN_check
define WLAN_STATUS_set notify (WLAN_check|global:INITIALIZED) {\
  my $v=`ctlmgr_ctl r wlan settings/ap_enabled`;;\
  chomp($v);;\
  fhem "set WLAN_STATUS $v" if($v ne Value("WLAN_STATUS");;\
}
define WLAN_ntfy notify WLAN_STATUS {\
  GetFileFromURL "http://" . Value("CCU_IP") . ":8181/fhem-2-ccu.exe?Status=dom.GetObject('" . Value("CCU_SysVar_Prefix") . "WLAN').State(" . Value("WLAN_STATUS") . ")"\
  }


Um nochmal die funktion zu erläutern:
* bei aufforderung der ccu - status aktualisieren und senden.
* nach zeitplan und neustart - statusänderungen senden.

für mich sieht das irgendwie alles gleich auch ?!

LG Tom

rudolfkoenig

 fhem "set WLAN_STATUS $v" if($v ne Value("WLAN_STATUS");;\

hier fehlt ein ).

Status aktualisieren geht mit "trigger WLAN_check", das versendet den Status nur bei Aenderung.
"trigger WLAN_STATUS" versendet unkonditional den Status. Status pruefen und es genau einmal versenden geht mit dieser Konstrukt nicht (man kann es aber ubauen :)

Dragonfly

Zitat von: rudolfkoenig schrieb am Sa, 16 Februar 2013 15:03"trigger WLAN_STATUS" versendet unkonditional den Status. Status pruefen und es genau einmal versenden geht mit dieser Konstrukt nicht (man kann es aber ubauen :)

dies sollte aber nicht nötig sein, da ja schlimmstenfall bei fhem-(re)start der aktuelle status überprüft wird - also fhem immer weiß was los ist.

lieg ich jetzt mal richtig?

Dragonfly

Eine Frage noch...

warum bzw. wohin verschwinden die "SET" Abschnitte?
set CCU_IP xxx.xxx.xxx.xxx
set CCU_SysVar_Prefix FB_

Als Dummy sind sie noch da, aber im Script nicht mehr?

Dragonfly

Ich habe nun versucht, zusätzlich zur Übertragung an die CCU einen ein/aus-Schalter für wlan einzubauen:
define WLAN_STATUS dummy
attr WLAN_STATUS devStateIcon 1:WLAN_Status.1 0:WLAN_Status.0
attr WLAN_STATUS setList on off
attr WLAN_STATUS group Status
attr WLAN_STATUS room Fritz!Box-2-CCU
define WLAN_check at +*00:05:00 trigger WLAN_check
attr WLAN_check group nächste Aktualisierung
attr WLAN_check room Fritz!Box-2-CCU
define WLAN_STATUS_set notify (WLAN_check|global:INITIALIZED) {\
  my $v=`ctlmgr_ctl r wlan settings/ap_enabled`;;\
  chomp($v);;\
  fhem "set WLAN_STATUS $v" if($v ne Value("WLAN_STATUS"));;\
}
attr WLAN_STATUS_set room Fritz!Box-2-CCU

define WLAN_on notify WLAN_STATUS:on.* {;;\
  qx(/usr/bin/ctlmgr_ctl w wlan settings/ap_enabled 1);;\
  fhem "set WLAN_STATUS 1";;}
attr WLAN_on room Fritz!Box-2-CCU

define WLAN_off notify WLAN_STATUS:off.* {;;\
  qx(/usr/bin/ctlmgr_ctl w wlan settings/ap_enabled 0);;\
  fhem "set WLAN_STATUS 0";;}
attr WLAN_off room Fritz!Box-2-CCU

define WLAN_ntfy notify WLAN_STATUS {\
  GetFileFromURL "http://" . Value("CCU_IP") . ":8181/fhem2ccu.exe?Status=dom.GetObject('" . Value("CCU_SysVar_FB_Prefix") . "WLAN').State(" . Value("WLAN_STATUS") . ")"\
  }
attr WLAN_ntfy group Status an CCU senden
attr WLAN_ntfy room Fritz!Box-2-CCU

define WLAN_STATUS_log FileLog ./log/FritzBox-%Y-%m.log WLAN_STATUS
attr WLAN_STATUS_log logtype text
attr WLAN_STATUS_log room Logs

Doch leider wird immer beim Manuellen schalten über FHEM zuerst ON bzw. OFF gesetzt, dann erst 1 und 0. An die CCU wird dann nur ON bzw. OFF übertragen, was nicht geht. Ich habe schon "sleep" vor dem Übertragen (Zeit überbrücken bis der Status auf 1/0 ist) probiert, "setList 1:ON,..." (manuelles setzen funktioniert: da hier der Status "1 ON" korrekt interpretiert wird) leider alles erfolglos.
Muß ich wirklich den Weg über einen 2.Dummy gehen??