Dummy State via Ssystemcommand setzen

Begonnen von wollik, 17 Januar 2024, 16:22:36

Vorheriges Thema - Nächstes Thema

Otto123

#15
Hallo Wollik,

kann ich nicht bestätigen. Ich habe eine Test DOIF in meiner Umgebung in deinem Sinne (vereinfacht) modifiziert, denke ich ;)
defmod IntervallTest DOIF ([00:05-23:55,+00:00:05]) (setreading $SELF Value__Set {(`date +%M:%S | tr -d '\n '`)},setreading $SELF Value_Copy [$SELF:Value__Set])
attr IntervallTest do always
attr IntervallTest room Test
Das arbeitet wie erwartet, bei Readings werdem synchron gesetzt. Oder ich habe Dein Problem nicht verstanden :)
BTW: man kann den Zeitstring auch so erzeugen {( strftime("%M:%S",localtime) )}, aber ich glaube Du wolltest einen Scriptaufruf simulieren?

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

wollik

#16
Hallo Otto,
ja das funktiniert, das Problem tritt in einer If Anweisung auf, wenn man/frau dort den Dummywert setzt.
Und ja in meinem Beispiel verwende ich das Shell Beispiel mit dem date Befehl nur als einfaches Beispiel. Da kommt eine andere Shell Befehlskette zum Einsatz.

Ich muß das Setzen des Dummys leider in runde Klammern schreiben sonst bekomme ich den Fehler, das die rechte Klammer der If Anweisung fehlt.

Bitte hast Du das einmal mit meinem DOIF Test versucht (Siehe Attachment), da der Fehler nur in einem IF Konstrukt auftritt.
Evtl. hast Du auch eine Idee wie ich die zusätzlichen Klammern um das Seten weg bekomme? dann funktioniert das Setzen ja evtl. richtig.

Viele Grüße
wollik

Otto123

#17
Zitat von: wollik am 26 Januar 2024, 21:28:20Evtl. hast Du auch eine Idee wie ich die zusätzlichen Klammern um das Seten weg bekomme?
Das liegt am DOIF: https://fhem.de/commandref_modular_DE.html#DOIF_Angaben_im_Ausfuehrungsteil
ZitatFalls ein Komma nicht als Trennzeichen zwischen FHEM-Befehlen gelten soll, so muss der FHEM-Ausdruck zusätzlich in runde Klammern gesetzt werden: ...((set lamp1,lamp2 on),set switch on)

Und zu deinem eigentlichen Problem kann ich nur sagen: Verschiebe das bitte nach dem DOIF Board und "Mister IF/DOIF - bitte übernehmen Sie" :)
So wird der Effekt sichtbar, ohne IF () () tritt es nicht auf.
([00:05-23:55,+00:00:05]) (IF (1) (setreading $SELF Value__Set {(`date +%M:%S| tr -d '\n '`)},setreading $SELF Value_Copy [$SELF:Value__Set]) )
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

Beim FHEM-IF wird der Code vor seiner Ausführung in Perl-if übersetzt, zu diesem Zeitpunkt werden Readingangaben in eckigen Klammern durch entsprechende Werte ersetzt. Das bedeutet, dass ein Verändern des Readings kurz davor nicht mehr greift, weil die Inhalte der Readings bereits zuvor ersetzt wurden.

In solchen Fällen solltest du auf Perl-if ausweichen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

wollik

Hallo Otto,
ich bin immer noch auf der Suche mittels at ein Shell Script (oder einen Shell Befehl) auszuführen und den Returnwert in ein Userattribut eines Devices zu schreiben.
Ich will kein dummy beschreiben, sondern brauche den Wert im Userattribut!
Leider verstehe ich nicht wie ich das machen könnte:

Hier meine Details:
device = OpenWB
userattrib = TS

defmod Get_TS at +*00:02:00 {\
   my $TimeStamp = qx(date +"%M:%S");;\
   ("set OpenWP:TS $TimeStamp");;\
}


Dieses einfache Version soll alle 2 Minuten via Shell Befehl den Timestamp holen und in das Userattribut schreiben.
weder (set... noch setreading... ) funktionieren;(
Bitte hättest Du dazu eine Idee?

Viele Grüße
wollik





TomLee

Hallo,

Hier ist der Befehl beschrieben um in Attribute zu schreiben.

defmod Get_TS at +*00:02:00 {\
  my $TimeStamp = qx(date +"%M:%S");;\
  fhem("attr $SELF TS $TimeStamp");;\
}

Gruß

Thomas

wollik

Hallo TomLee,
D A N K E  für die schnelle Antwort.
JA ich hatte das auch schon versucht, funktioniert leider nicht;(

defmod Get_WB_Energy at +*00:00:30 {\
   my $TimeStamp = qx(date +"%M:%S");;\
   fhem("attr OpenWB Total_Active_Energy $TimeStamp");;\
}


Welcher Wert wird mit $SELF angesprochen ?

Viele Grüße
wollik

TomLee

ZitatWelcher Wert wird mit $SELF angesprochen ?

Upps, sry. Das at selbst. Das Du in ein anderes Device schreiben willst hab ich gar nicht beachtet.

Oben schreibst Du noch das ein userattr TS hast, jetzt willst in Total_Active_Energy schreiben. Existiert das userattr ?

Extra noch einen Hinweis auf den Parameter -silent hab ich auch vergessen zu erwähnen, wenn das wirklich so zum Einsatz kommen soll.



wollik

Hallo TomLee,
sorry das Userattribut Total_Active_Energy existiert und wird vom Device OpenWB auch regelmäßig im 10 Minutentakt befüllt. Ich hatte das Alles vereinfacht also kein TS sondern Total_Active_Energy.

Nun mit diesem at sollte das Attribut alle 30 Sekunden geschrieben werden, was ich zum Testen auf diesen kurzen Wert gesetzt habe.

Ich brauche die geschriebenen Werte von Total_Active_Energy im Log, darum habe ich kein -silent.

Aber wie gesagt, ich bekomme den Attributwert nicht geschrieben;( weil ich das Setzen via set oder setreading oder ... nicht hinbekomme.


Viele Grüße
wollik

TomLee

Glaube jetzt versteh ich.

Du möchtest den Wert nicht in ein Attribut schreiben, sondern wirklich in ein Reading.

Du befindest dich in dem Ausführungsteil des at in Perl (die geschweiften Klammern). In Perl musst einen FHEM-Befehl über die Funktion fhem() ausführen. Das ist die Syntax so wie ich sie gezeigt habe, nur das mein Beispiel den FHEM-Befehl attr ausführt.

Du magst den FHEM-Befehl setreading ausführen, das würde dann so aussehen:

fhem("setreading OpenWB Total_Active_Energy $TimeStamp")


wollik

Hallo TomLee,
ich habe es jetzt hinbekommen!
hier meine Definition:

defmod Get_WB_Energy at +*00:00:10 {\
   my $TimeStamp = qx(date +"%M:%S");;\
   fhem("setreading OpenWB Total_Active_Energy $TimeStamp");;\
}


Ich hatte zuvor mit attr Anstelle von setreading das versucht;(

Vielen Lieben DANK an Alle
wollik


Otto123

weniger umständlich, nur Perl und kein Shellzugriff:
defmod Get_WB_Energy at +*00:00:10 setreading OpenWB Total_Active_Energy { (strftime("%M:%S",localtime) )}
Aber ich weiß - set magic ist nicht so beliebt. :D
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

#27
noch weniger umständlich :)

setreading OpenWB Total_Active_Energy {("$min:$sec")}

wollik

Hallo Otto, hallo TomLee,
das Beispiel mit dem Timestamp war nur zur Demonstration.
Der richtige Shell Befehl besorgt sich Daten, bereitet diese dann auf und das Ergebnis wird zurück gegeben.

Der Befehl mit {("$min:$sec")} funktioniert und schreibt den Timestamp in das Reading.
Der Befehl mit { (strftime("%M:%S",localtime) )} funktioniert nicht sondern schreibt "{ (strftime("%M:%S",localtime) )}" in das Setting. Wenn ich die Spaces entferne funktioniert es!

Wie würde das dann aussehen wenn ich den Returnwert vom Shell Befehl haben möchte?
mit:
defmod WB_Energy_Test at +00:00:05 setreading OpenWB Total_Active_Energy {(\
    my $WB_Energy = qx(date +"%H:%M");;    \
    print ":0:> $WB_Energy\n";; )\
}
 

funktioniert es nicht, sondern der Inhalt in { } wird in das reading gesetzt.

Wie müßste der Befehl in { } formatiert werden um das Ergebniss vom Shell Script zu bekommen?


D A N K E an Euch
Wollik

Otto123

print funktioniert an der Stelle mM nicht. Ich nehme stattdessen immer return.
Wenn Du sagst die Spaces zwischen {( stören, dann stört der Zeilenumbruch \ dazwischen mit Sicherheit.

Mann muss die Perlbefehle im set magic zusätzlich klammern (siehe commandref) also
{ <Perlbefehl> } wird zu {( <Perlbefehl> )}
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz