FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Snappo am 03 Dezember 2018, 09:58:57

Titel: Devicename anhand von Attribut ermitteln
Beitrag von: Snappo am 03 Dezember 2018, 09:58:57
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
Titel: Antw:Devicename anhand von Attribut ermitteln
Beitrag von: Beta-User am 03 Dezember 2018, 14:28:22
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
Titel: Antw:Devicename anhand von Attribut ermitteln
Beitrag von: Snappo am 03 Dezember 2018, 15:48:45
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.  ::)
Titel: Antw:Devicename anhand von Attribut ermitteln
Beitrag von: Beta-User am 04 Dezember 2018, 07:53:38
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
Titel: Antw:Devicename anhand von Attribut ermitteln
Beitrag von: Snappo am 04 Dezember 2018, 11:15:02
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
Titel: Antw:Devicename anhand von Attribut ermitteln
Beitrag von: betateilchen am 04 Dezember 2018, 11:23:45
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.
Titel: Antw:Devicename anhand von Attribut ermitteln
Beitrag von: betateilchen am 04 Dezember 2018, 11:32:14
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.
Titel: Antw:Devicename anhand von Attribut ermitteln
Beitrag von: Snappo am 04 Dezember 2018, 14:13:52
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
Titel: Antw:Devicename anhand von Attribut ermitteln
Beitrag von: betateilchen am 04 Dezember 2018, 14:30:32
"...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.
Titel: Antw:Devicename anhand von Attribut ermitteln
Beitrag von: Snappo am 04 Dezember 2018, 14:42:24
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
Titel: Antw:Devicename anhand von Attribut ermitteln
Beitrag von: betateilchen am 04 Dezember 2018, 15:28:14
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.
Titel: Antw:Devicename anhand von Attribut ermitteln
Beitrag von: Snappo am 04 Dezember 2018, 15:52:49
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.