gelöst: JSON zu MQTT Device senden aus Fhem

Begonnen von matze1999, 01 April 2023, 15:24:37

Vorheriges Thema - Nächstes Thema

matze1999

Sehr schön, das passt, wenn man es so macht, kann man auch die Schriftfarbe ändern, ich denke aber, dass kann man auch anders machen ich hab die hex Farbe jetzt als String drin:

sub PixelItText {
    my $text = shift;
    my $farbe = shift;
    fhem( qq(set myBroker publish House/PixelIt/setScreen {"text":
{"textString":"$text","scrollText":"auto","bigFont":false,"centerText":false,"scrollTextDelay":40,"hexColor":"#$farbe","position":{"x":0,"y":1}}}))
}

ausgeführt wird damit der Text in rot, z.B.:

{PixelItText ("Mein Text","FF0000")}
matze1999

Beta-User

Grundsätzlich finde ich es ja begrüßenswert, wenn ihr ohne prototypes arbeitet. Bitte aber daran denken, dass man dann trotzdem eine (andere) "Sicherung" braucht:

sub PixelItText {
    my $text = shift // q{Kein Text!!!};
    my $farbe = shift // 'FF0000';

Und "Quotes in Perl" unbedingt suchen und lesen!
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

matze1999

Danke, was mich noch interessieren würde, wie kann man solch eine Routine für mehrere dieser Devices (Pixelit MQTT) erstellen, dazu müsste man sicher das topic mit übergeben:

House/PixelIt
bekommt man das dann auch irgendwie in diese Art Devices, so dass das dann für "set" zur Verfügung steht?

matze1999

Beta-User

Klar geht das mit MQTT2_DEVICE, hatte ich ja ganz zu Beginn schon geschrieben.
 
Entweder du übergibst den Topic mit in die Routine (als weiteres Argument), und setzt dann aus der Routine den Publish-Befehl ab (dazu muss man aber das IO kennen!), oder du nutzt halt die Funktionalitäten von MQTT2_DEVICE-setList und machst eine concatenation aus dem Topic-String und der Rückgabe welcher Routine auch immer.... Hauptsache es kommt am Ende topic+payload raus, dann versendet das MQTT2_DEVICE über "sein" IO.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

matze1999

Zitat von: Beta-User am 03 April 2023, 19:54:35.... du nutzt halt die Funktionalitäten von MQTT2_DEVICE-setList und machst eine concatenation aus dem Topic-String und der Rückgabe welcher Routine auch immer.... Hauptsache es kommt am Ende topic+payload raus, dann versendet das MQTT2_DEVICE über "sein" IO.

da komme ich nicht ganz mit, aber Danke.

Ich versuche erst mal einfache Dinge, wie z-.B. readings eines anderen Devices anzuzeigen, geht aber nicht:

{PixelItText ("MQTT2_DVES_6CA8FD:Global_Temperature °C")}
matze1999

Beta-User

Du MUSST dich mit der Syntax beschäftigen, dauerhaft hat vermutlich keiner Lust, dir ständig auf's Pferd zu helfen, ich jedenfalls nicht.

ReadingsVal() (commandref Perl-Specials) und "concatenation" (allg. Perl-Wissen) sind deine Freunde.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Otto123

Anstatt Deines ersten Textes kannst Du sowas einsetzen:
ReadingsVal("MQTT2_DVES_6CA8FD","Global_Temperature","Meintext")Probiere es am Besten in der FHEM Kommandozeile:
Die einfachste Perlfunktion, genau genommen bloß ein String:
{"Mein Text"}Einen String aus einem Reading lesen
{ReadingsVal("MQTT2_DVES_6CA8FD","Global_Temperature","Meintext")}
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

matze1999

Zitat von: Beta-User am 04 April 2023, 10:16:29Du MUSST dich mit der Syntax beschäftigen, dauerhaft hat vermutlich keiner Lust, dir ständig auf's Pferd zu helfen, ich jedenfalls nicht.

ReadingsVal() (commandref Perl-Specials) und "concatenation" (allg. Perl-Wissen) sind deine Freunde.

hab verstanden, trotzdem Danke.

matze1999

matze1999

Zitat von: Otto123 am 04 April 2023, 11:21:24Probiere es am Besten in der FHEM Kommandozeile:
Die einfachste Perlfunktion, genau genommen bloß ein String:
{"Mein Text"}Einen String aus einem Reading lesen
{ReadingsVal("MQTT2_DVES_6CA8FD","Global_Temperature","Meintext")}

Danke, mache ich, muss nur die richtige Syntax finden mit den " in der Sub.

matze1999

matze1999

Hallo,

jetzt passt es:

sub PixelItText {
    my $text = shift // q{Kein Text!!!};
    my $farbe = shift // 'FFFFFF';
    fhem( qq(set myBroker publish House/PixelIt/setScreen {"text":
{"textString":"$text","scrollText":"auto","bigFont":false,"centerText":false,"scrollTextDelay":40,"hexColor":"#$farbe","position":{"x":0,"y":1}}}))
}

sub PixelItTemp {
    my $farbe = shift // 'FFFFFF';
    my $temp = ReadingsVal("MQTT2_DVES_6CA8FD","Global_Temperature",0)."°C";
fhem( qq(set myBroker publish House/PixelIt/setScreen {"text":
{"textString":"$temp","scrollText":"auto","bigFont":false,"centerText":true,"scrollTextDelay":40,"hexColor":"#$farbe","position":{"x":0,"y":1}}}))
}

Danke noch mal an alle.

matze1999

Otto123

Nö  ::) keine zweite Sub sondern der Aufruf so - vor allem wenn die Temperatur wirklich eine Zahl ist.
{PixelItText (ReadingsNum("MQTT2_DVES_6CA8FD","Global_Temperature",0)."°C",'AFFECC')}
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

matze1999

hi Otto123,

ja so geht das auch ;-)

jetzt bräuchte ich noch einen schubs in die richtige richtung: diese Uhr zeigt uhrzeit und Datum im Wechsel an, wenn ich sie anschalte bzw. set clock (s.o.) beschicke. Ich würde gern die Temperatur jetzt als dritte info einblenden, also

Datum (5s)
Uhrzeit (5s)
Temperatur

Das bedeutet, ich müsste die Temperatur für 5s anzeigen, dann eine set clock ausführen und nach 10 s wieder die Temperatur anzeigen. Ich hab keine richtige Idee, ich hatte schon überlegt, das mit at zu machen: at Temperatur anzeigen, nach 5 s wieder at set clock und dann nach 10 s wieder at Temperatur anzeigen. aber dafür fehlt mir irgendwie die syntax.

aber so richtig "fühlt" sich das nicht an.

matze1999

Otto123

Also nur aus der commandref und vom Prinzip her
define a4 at *00:00:10 set temp on ;; sleep 5 ;; set clock on 
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

matze1999

Hallo Otto,

danke, so funktionierts relativ alle 10 s (+*):

defmod a4 at +*00:00:10 {PixelItTemp ("FF0000")} ;; sleep 5 ;; set MQTT2_PixelIt clock
Danke,

matze1999

matze1999

#29
noch was: Temperaturanzeige noch farblich angepasst ;-)

sub PixelItTemp {
    my $temp = ReadingsVal("MQTT2_DVES_6CA8FD","Global_Temperature",0)."°C";
# kalt = blau
if (ReadingsVal("MQTT2_DVES_6CA8FD","Global_Temperature",0) < 10)
{fhem( qq(set myBroker publish House/PixelIt/setScreen {"text":
{"textString":"$temp","scrollText":"auto","bigFont":false,"centerText":true,"scrollTextDelay":40,"hexColor":"0000FF","position":{"x":0,"y":1}}}))}
# warm = gelb
elsif ((ReadingsVal("MQTT2_DVES_6CA8FD","Global_Temperature",0) >= 10) && (ReadingsVal("MQTT2_DVES_6CA8FD","Global_Temperature",0) <= 20))
{fhem( qq(set myBroker publish House/PixelIt/setScreen {"text":
{"textString":"$temp","scrollText":"auto","bigFont":false,"centerText":true,"scrollTextDelay":40,"hexColor":"FFFF00","position":{"x":0,"y":1}}}))}
# heiss = rot
elsif (ReadingsVal("MQTT2_DVES_6CA8FD","Global_Temperature",0) > 20)   
{fhem( qq(set myBroker publish House/PixelIt/setScreen {"text":
{"textString":"$temp","scrollText":"auto","bigFont":false,"centerText":true,"scrollTextDelay":40,"hexColor":"FF0000","position":{"x":0,"y":1}}}))}
}

matze1999