Lösung: Wie HMCCU Systemvariablen von ccu2 "per push" übertragen?

Begonnen von HeinzApfel, 20 Dezember 2016, 10:36:55

Vorheriges Thema - Nächstes Thema

HeinzApfel

Hallo,

ich nutze HMCCU mit meiner ccu2 und würde gerne Systemvariablen übertragen. Die ccu2 berechnet mir z.B. den Ölverbrauch des Heizungs-Brenners.

Momentan polle ich die ccu2 jede Minute um die Variablen zu übertragen.

Frage: Geht das besser? Ich würde die Systemvariable gerne nur übertragen, wenn sich deren Inhalt geändert hat und vielleicht auch als "push" von der ccu2?

Hier mein aktueller Kode:
define CCU2 HMCCU ccu2.fritz.box
get CCU2 devicelist
get CCU2 vars HZ_Brenner_VB_(Heute|Jahr)
# BidCos-RF und HM-IP RPC Server konfigurieren und starten
attr CCU2 rpcport 2001,2010
attr CCU2 rpcserver on # Automatisch starten
set CCU2 rpcserver on
#attr CCU2 verbose 4

define CCU2_vars at +*00:01:00 get CCU2 vars HZ_Brenner_VB_(Heute|Jahr)
#attr CCU2_vars verbose 4


Vielen Grüße und Danke,
Heinz

zap

Leider unterstützt die RPC Schnittstelle der CCU2 keine Weiterleitung von Variablenänderungen. Das liegt daran, dass die Systemvariablen in der CCU in einer logischen Schicht oberhalb der RPC-Schicht liegen und diese daher nichts von den Variablen weiß.

Einzige Möglichkeit: In der CCU ein Programm erstellen, das bei Änderung einer Variablen einen Set-Befehl in FHEM auslöst, also im Prinzip der umgekehrte Weg von HMCCU.

Ich habe mal irgendwo beschrieben, was man dazu CCU seitig benötigt. Bei Gelegenheit suche ich mal danach.
2xCCU3 mit ca. 100 Aktoren, Sensoren
Entwicklung: FHEM auf Proxmox Debian VM
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: HMCCU, (Fully, AndroidDB)

HeinzApfel

Hi,

Danke. Das klingt nach einer guten Lösung.

Kannst du mir bitte noch einen Tipp geben, wie das geht? Suche war erfolglos.

Mir fällt sonst nur ein "get CCU2 vars HZ_Brenner_VB_(Heute|Jahr)" über socat ein, den ich über System.Exec vom cuxd auslöse. Klingt irgendwie wackelig.

zap

Zitat von: HeinzApfel am 20 Dezember 2016, 12:52:19
Mir fällt sonst nur ein "get CCU2 vars HZ_Brenner_VB_(Heute|Jahr)" über socat ein, den ich über System.Exec vom cuxd auslöse. Klingt irgendwie wackelig.

Genau das meine ich aber: netcat bzw. socat auf den FHEM telnet Port. Allerdings würde ich dort kein "get vars" ausführen sondern entweder einfach ein Dummy Device auf den Variablenwert setzen oder mit dem FHEm Befehl setreading ein Readingg in einem FHEM Device setzen. Wenn Du cuxd verwendest statt system-exec, sollte das stabil laufen.
2xCCU3 mit ca. 100 Aktoren, Sensoren
Entwicklung: FHEM auf Proxmox Debian VM
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: HMCCU, (Fully, AndroidDB)

HeinzApfel

Für die "Nachwelt" hier eine kurze Anleitung, wie ich das mittlerweile gelöst habe.

Auf der CCU2 den cuxd installieren und ein Gerät "(28) System" mit Funktion "Exec" einrichten.
Weitere Einstellungen, wie z.B. "KEY|CMD_SHORT", müssen nicht eingerichtet werden. Sie werden direkt über "STATE" aus dem Skript gesetzt

Im CCU2-Skript dann z.B.:

dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl 'http://srv.fritz.box:8083/fhem?cmd=set%20HZ_Brenner_VB_Heute%20" + verbrauchtT.ToString(3) + ";set%20HZ_Brenner_VB_Woche%20" + verbrauchtW.ToString(3) + ";set%20HZ_Brenner_VB_Monat%20" + verbrauchtM.ToString(3) + ";set%20HZ_Brenner_VB_Jahr%20" + verbrauchtJ.ToString(3) + "'");

In diesem Beispiel werden insgesamt 4 Systemvariablen "HZ_VB_Heute" etc. übergeben.

Oder so sieht der Status des Brenners meiner Ölheizung aus, wenn die Ölpumpe eingeschaltet wird:

var EinZeit= dom.GetObject("HZ_Brenner_EinZeit");
EinZeit.State(system.Date("%F %T"));
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl 'http://srv.fritz.box:8083/fhem?cmd=set%20HZ_Brenner_Status%20on'");


Unter FHEM entsprechende "dummy" mit dem Namen der Systemvariablen einrichten:

define HZ_Brenner_VB_Heute dummy

define HZ_Brenner_VB_Woche dummy

define HZ_Brenner_VB_Monat dummy

define HZ_Brenner_VB_Jahr dummy

define HZ_Brenner_Status dummy

define HZ_Brenner_fl FileLog log/HZ_Brenner-%Y-%m.log HZ_Brenner_(Status|BS_|VB_).*
attr HZ_Brenner_fl logtype text

define HZ_Brenner_stat statistics HZ_Brenner_VB_Jahr
attr HZ_Brenner_stat deltaReadings HZ_Brenner_VB_Jahr
attr HZ_Brenner_stat group Energie
attr HZ_Brenner_stat singularReadings HZ_Brenner_VB_Jahr:Delta:(Hour|Day|Month|Year)


Und nach Belieben auswerten:

define 08_Oelverbrauch readingsGroup \
                    HZ_Brenner_VB_Heute \
                statHZ_Brenner_VB_JahrHour \
                statHZ_Brenner_VB_JahrHourLast \
                statHZ_Brenner_VB_JahrDay \
                statHZ_Brenner_VB_JahrDayLast \
                statHZ_Brenner_VB_JahrMonth \
                statHZ_Brenner_VB_JahrMonthLast \
                statHZ_Brenner_VB_JahrYear
attr 08_Oelverbrauch alias Oelverbrauch
attr 08_Oelverbrauch mapping { \
            HZ_Brenner_VB_Heute         => 'Heute', \
        statHZ_Brenner_VB_JahrHour      => 'Aktuelle Stunde', \
        statHZ_Brenner_VB_JahrHourLast  => 'Letzte Stunde', \
        statHZ_Brenner_VB_JahrDay       => 'Heute', \
        statHZ_Brenner_VB_JahrDayLast   => 'Gestern', \
        statHZ_Brenner_VB_JahrMonth     => 'Aktueller Monat', \
        statHZ_Brenner_VB_JahrMonthLast => 'Letzter Monat', \
        statHZ_Brenner_VB_JahrYear      => 'Jahr',  \
        }
attr 08_Oelverbrauch nostate 1
attr 08_Oelverbrauch notime 1
attr 08_Oelverbrauch room Plot_Energie,Plot_Strom
attr 08_Oelverbrauch valueFormat { \
            HZ_Brenner_VB_Heute         => '{sprintf("%.1f l",$VALUE)}', \
        statHZ_Brenner_VB_JahrHour      => '{sprintf("%.1f l",$VALUE)}', \
        statHZ_Brenner_VB_JahrHourLast  => '{sprintf("%.1f l",$VALUE)}', \
        statHZ_Brenner_VB_JahrDay       => '{sprintf("%.1f l",$VALUE)}', \
        statHZ_Brenner_VB_JahrDayLast   => '{sprintf("%.1f l",$VALUE)}', \
        statHZ_Brenner_VB_JahrMonth     => '{sprintf("%.1f l",$VALUE)}', \
        statHZ_Brenner_VB_JahrMonthLast => '{sprintf("%.1f l",$VALUE)}', \
        statHZ_Brenner_VB_JahrYear      => '{sprintf("%.1f l",$VALUE)}', \
        }
attr 08_Oelverbrauch valueStyle style="text-align:right"
#attr 08_Oelverbrauch nolinks

define 08_Oelverbrauch_wl SVG HZ_Brenner_fl:my_Oelverbrauch_1:CURRENT
attr 08_Oelverbrauch_wl plotsize 800,240
attr 08_Oelverbrauch_wl room Plot_Energie,Plot_Strom
attr 08_Oelverbrauch_wl title "Ölverbrauch:" .  sprintf("%.1f", $data{currval1}) . "l (" . sprintf("%.1f", $data{min1}) . " - " . sprintf("%.1f", $data{max1}) . ")"


chris1284

leider bekomme ich es nicht ganz hin.
mein code
Zitat
var myVal=dom.GetObject('svEnergyCounter_3969_NEQ1808818:2').Value();
dom.GetObject("az_sw_lm01_count").State(myVal.ToString(2));
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl 'http://192.168.2.12:8083/fhem?cmd=setreading%20az_sw_lm01_measure%20power_sumccu%20'' + myVal.ToString(2) + '' ");



die systemmeldung

ZitatApr 26 21:44:37 homematic-ccu2 daemon.info cuxd[21141]: system(LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl 'http://192.168.2.12:8083/fhem?cmd=setreading%20az_sw_lm01_measure%20power_sumccu%20'' + myVal.ToString(2) + '') exit(2) 0s

chris1284

ok. liegt wohl daran  FHEMWEB WEB CSRF error:  ne csrf_179864574700019. For detals see the csrfToken FHEMWEB attribute

zap

Ja, entweder das Session Token in FHEM abschalten oder auf CCU Seite statt Curl netcat verwenden und die Daten auf den Telnet von FHEM schicken.
2xCCU3 mit ca. 100 Aktoren, Sensoren
Entwicklung: FHEM auf Proxmox Debian VM
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: HMCCU, (Fully, AndroidDB)