Guten Morgen,
ich finde leider nirgens eine Lösung zu meinem Problem oder suche Falsch. Kurz zu meinem Aufbauen.
Ich besitze 433 Steckdosen sowie einige die via MQTT geschalten werden.
Damit ich auchmal die Funksteckdosen tauschen kann ohne groß im Fhem was zu ändern, habe ich die normalen Geräte als Dummy angelegt welche das ein userattr Steckdose habe. Dort ist der entsprechende 433 Devicename hinterlegt. Via notify wird nun ein kleines Script ausgeführt welches dem 433 Device sagt das es geschalten werden soll.
Jetzt würde ich dies gern auch auf meine MQTT Devices anwenden. An sich auch ohne weiteres machbar jedoch möchte ich dem Dummy jetzt den Stromverbrauch vom MQTT (Sonoff Pow oder ähnliches) mitteilen. Ansich würde das mit einem Notify recht fix gehen. Jedoch klappt das natürlich nicht mehr wenn dann ein anderes gerät anschließe und und nur das userattr im Dummy ändere. Er übermittelt dann den verbrauch noch an das alte Gerät vom Notify.
Ohjeh ich verstehe gerade nicht mal selbst was ich da geschrieben habe. Ich hoffe da blickt jemand durch. :-[
Aber nun zu meiner eigentlichen Frage. ;D
Kann ich ein Devicenamen anhand eine bestimmten einmaligen Attribut ermitteln?
AttrVal("TV","Steckdose","");
Gibt mir ja das Attribut zurück. Geht das ganz auch irgendwie andersherum?
Mit List komm ich meinem Ziel zwar schon recht nahe. Jedoch wüsste ich nicht wie ich dieses Zielbringend im Notify einsetzen könnte.
list Steckdose=Sonnoff_Pow_01
Vorab schonmal Vielen Dank
Andy
Mahlzeit.
Ist wirklich schecht nachvollziehbar, was du da gemacht hast.
Ohne im Detail deine Devices hier aufzulisten, wird das vermutlich nichts.
Bevor du das aber machst, wirfst du vilelicht als erstes mal einen Blick auf ReadingsProxy ;) . Könnte sein, dass das genau das macht, was du mit deinem Konstrukt erreichen willst: Ein Gerät für einen Zweck, mit dem du eine Abstraktion zwischen dem eigentlichen "physikalischen Gerät" und deiner Logik machst und dann nachträglich das darunter liegende physikalsiche Gerät tauschen kannst und dann die set-Befehle usw. ändern, ohne dass die andere Logik was davon mitbekommt.
Viel Erfolg,
Beta-User
Vielen Dank Beta-User für den Ansatz. ReadingsProxy scheint dieses unterstützen.
Aber so recht sehe ich da noch nicht durch vorallem wie ich das bei mir implementieren könnte. Aber ich werd es mal probieren.
Versuche aber jetzt nochmal vereinfacht darzustellen was mein Ziel ist.
Dummy
Internals:
NAME d_Schalter_1
NR 407
STATE off
TYPE dummy
READINGS:
2018-12-03 12:57:55 state off
Attributes:
Steckdose mqtt_sonoff_pow_1746
webCmd on:off
Notify
Internals:
DEF d_Schalter.*.:on|d_Schalter.*.:off {
my $steckdose=AttrVal("$NAME","Steckdose","");
fhem("set $steckdose $EVENT");
}
NAME n_schaltung
NR 137
NTFY_ORDER 50-n_schaltung
REGEXP d_Schalter.*.:on| d_Schalter.*.:off
STATE 2018-12-03 14:49:29
TRIGGERTIME 1543844969.78383
TYPE notify
Steckdose
Internals:
NAME mqtt_sonoff_pow_1746
NR 408
STATE off
TYPE dummy
READINGS:
2018-12-03 12:57:55 state off
2018-12-03 15:08:39 sensor-energy-total 191.14
Attributes:
webCmd on:off
Wenn ich jetzt den Dummy on oder off schalte wird dies durch das notify auch mit der Steckdose gemacht. Das ist super und funktioniert dank des UserAttr Steckdose im Dummy. Dadurch funktioniert das auch mit allen Geräten wo ich einfach nur noch die entsprechende Steckdose zuordnen muss.
Die Steckdose erhält jedoch nun den Stromverbrauch im Reading sensor-energy-total. Dieser soll jetzt im Endeffekt auch im Dummy erscheinen damit ich den Verbrauch ermitteln kann. Diese Aufgabe soll auch wieder ein notify übernehmen.
Notify
Internals:
DEF mqtt_sonoff.*.: sensor-energy-total {
### HIER KOMME ICH NICHT WEITER ### my $geraet=?????????????
fhem("setreading $geraet $EVENT");
}
NAME n_zaehler
NR 137
NTFY_ORDER 50-n_zaehler
REGEXP mqtt_sonoff.*.: sensor-energy-total
STATE 2018-12-03 14:49:29
TRIGGERTIME 1543844969.78383
TYPE notify
Jedoch ist bei den Steckdosen nicht der entsprechende Dummy hinterlegt. Dadurch würde ich gern ein Notify erstellen, welches den Namen der Steckdose vom Event in allen dummys mit dem Attribut Steckdose sucht damit ich dann via setreading den Wert zuweisen kann.
Ich hoffe das ist jetzt ein bisschen verständlicher. ::)
versuch's mal mit FILTER, für Trockenübungen erst mal mit list statt set:
list .*:FILTER=Steckdose=mqtt_sonoff_pow_1746
Wenn's klappt, das dann statt $gerät: .*:FILTER=Steckdose=$NAME
So habe es jetzt mal probiert. Mit
list .*:FILTER=Steckdose=mqtt_sonoff_pow_1746
gibt er mir Kompletten Dummy aus.
Jedoch kann ich es nicht im Notify verwenden.
my $geraet = .*:FILTER=Steckdose=$NAME; --> syntax error at (eval 50729) line 3, near "= ."
fhem("setreading .*:FILTER=Steckdose=$NAME $EVENT"); --> Kein Fehler aber im Log erscheint 2018.12.04 11:13:09 3 : setreading .*:FILTER=Steckdose=mqtt_sonoff_pow_1746 sensor-energy-power: 6
Zitat von: Snappo am 03 Dezember 2018, 09:58:57
Kann ich ein Devicenamen anhand eine bestimmten einmaligen Attribut ermitteln?
nichts einfacher als das...
my $geraet = (defInfo('Steckdose=mqtt_sonoff_pow_1746','NAME'))[0];
Das funktioniert, soweit es nur ein Gerät gibt, das dieses Attribut besitzt.
Sollte es mehrere Geräte mit identischem Attribut geben, musst Du das von defInfo() zurückgegebene array mit deviceNames selbst auswerten.
abgesehen davon, dass es technisch möglich ist, bleibt Dein Vorhaben völlig abstrus.
Zitat
Damit ich auchmal die Funksteckdosen tauschen kann ohne groß im Fhem was zu ändern, habe ich die normalen Geräte als Dummy angelegt welche das ein userattr Steckdose habe. Dort ist der entsprechende 433 Devicename hinterlegt. Via notify wird nun ein kleines Script ausgeführt welches dem 433 Device sagt das es geschalten werden soll.
Es funktioniert. Danke euch seid doch die Besten :)
Aber um es optimal zu nutzen müsste ich bei dem Aufruf
my $geraet = (defInfo('Steckdose=mqtt_sonoff_pow_1746','NAME'))[0]; --> Funktioniert
my $geraet = (defInfo('Steckdose=$NAME','NAME'))[0]; --> Funktioniert leider nicht
mit $NAME arbeiten. Was aber leider nicht funktioniert.
PERL WARNING: Use of uninitialized value $geraet in concatenation (.) or string at (eval 68790) line 3
"...denn sie wissen nicht, was sie tun"
Einmal mehr ein typischer Fall der Sorte "fehlende perl Grundlagenkenntnisse", mit FHEM hat das nix zu tun.
Probier mal so:
my $geraet = (defInfo("Steckdose=$NAME",'NAME'))[0];
und beachte die doppelten Anführungszeichen.
Das wars. Es funktioniert :)
Vielen Dank!
Aber genau deshalb habe ich mich ja an den Anfänger Bereich gewendet. Da ich mich mit Fhem und PERL nicht so auskenne. :-\
So um es jetzt nochmal kurz zu erklären was ich jetzt machen kann. Und warum ich es eigendlich ziemlich gut finde.
Ich habe 10 Geräte... TV, Computer, Lichter
diese sind an 433 Steckdosen, sonoff, usw angeschlossen.
Manche können Stromverbrauch messen manche nicht.
Wenn ich jetzt TV Stromverbrauch messen und schalten möchte brauch ich einfach nur entsprechenden Adapter dran schließen und im FHEM das UserAttr Steckdose angeben. DAS wars alles funktioniert.
Wenn ich nach einem Monate zu einem anderen Gerät wechseln möchte mit Stromverbrauch messen, kann ich es einfach wechseln und das UserAttr anpassen. Genauso wenn ich ein Gerät nicht mehr so schalten möchte oder ein neues einbinde. Ich brauche nur den entsprechenden Dummy und das wars.
Und es sind immer die Werte am richtigen Gerät hinterlegt. Also ich find es echt Genial. ;D ;D ;D
Zitat von: Snappo am 04 Dezember 2018, 14:42:24
Also ich find es echt Genial.
Das kann nur jemand genial finden, der noch nicht verstanden hat, wie FHEM funktioniert.
Aber da kommst Du bestimmt irgendwann auch noch selbst drauf.
Verstehe jetzt nicht so ganz wo das Problem liegt.
Ich wollte etwas umsetzen womit ich einfach meine Geräte verwalten und die Steckdosen tauschen kann. Funktioniert auch dank eurer Hilfe einwandfrei. :D
Jetzt zu sagen das man FHEM nicht verstanden hat und die Idee absurd ist, ist dann doch schon weit hergeholt. Idee war da und Ziel wurde erreicht. Klar es gibt bestimmt immer bessere Wege, aber man kann auch nicht alles kennen. Ich freu mich halt das es funktioniert und hab wieder was dazu gelernt.
Ich lass mich auch gern eines besseren belehren. Aber einfach nur die Idee schlecht zu machen bringt einen auch nicht weiter.
Anstatt man einem vielleicht den geeigneteren weg aufzeigt.