FHEM Forum

FHEM - Anwendungen => Beleuchtung => Thema gestartet von: Stefan_Anfänger am 23 Februar 2018, 17:30:12

Titel: Status von Lampen über Telegram abfragen
Beitrag von: Stefan_Anfänger am 23 Februar 2018, 17:30:12
Hallo,
Ich bin neu in diesen Forum und hoffe das mein Beitrag hier richtig ist.
Bei der folgenden Aufgabe habe ich Probleme:
Ich bekomme von meiner SPS den Schaltzustand der Lampen (insgesamt 9 Stk.) und möchte sie über Telegramm abfragen.
Jetzt zu den Details: Der Status von der SPS kommt als ModbusCoil an und ich habe schon ein Notify geschrieben das meine Telegramm Nachrichten abfängt,
aber ich bekomme die beiden Sachen nicht vernünftig mit einander verbunden.
Ich hoffe das ihr mir weiter helfen könnt.
Stefan der Anfänger
Titel: Antw:Status von Lampen über Telegram abfragen
Beitrag von: MadMax-FHEM am 23 Februar 2018, 20:25:08
Vielleicht hilft das:

https://forum.fhem.de/index.php/topic,54432.msg460107.html#msg460107

Oder evtl. das:

https://forum.fhem.de/index.php/topic,77297.0.html

Kurz, da Handy...

Gruß, Joachim
Titel: Antw:Status von Lampen über Telegram abfragen
Beitrag von: Stefan_Anfänger am 24 Februar 2018, 13:02:51
Erstmal fielen Dank für die Antwort, die Idee ist zwar sehr gut, aber für meine Zwecke zu aufwändig.
ich habe gestern noch was ausprobiert. Vielleicht  kann man es verbessern:
wenn ich "Wohnzimmerlampe Status" über Telegram schreibe, setzt mein Telegram-Bot ein Dummy auf an.
Als nächstes habe ich 2 DOIF, beide warten darauf das der Dummy auf an geht.
Der 1. DOIF schickt mir eine Nachricht, wenn das Licht an ist und
der 2. DOIF wenn das Licht aus ist. Danach wird der Dummy wieder ausgeschaltet.
Die Idee funktioniert auch sehr gut, aber ich brauche sehr fiele Dummys und DOIF oder ist das Normal?
Titel: Antw:Status von Lampen über Telegram abfragen
Beitrag von: MadMax-FHEM am 24 Februar 2018, 13:49:46
Wenn ich mir deine Umsetzung so ansehe und mit den verlinkten Möglichkeiten vergleiche, dann ist mindestens die erste verlinkte deutlich einfacher und v.a. es wird geprüft, wer die Nachricht geschickt hat, sonst kann ja "jeder" bei dir schalten und walten...

Die erste verlinkte Variante reagiert per Notify auf eine eingegende Nachricht und führt entsprechende Befehle nach Prüfung aus...

Ich habe genau ein Notify und dann eine Sub die prüft was zu tun ist und dann eben Befehle ausführt oder Statusmeldungen zurück schickt...

Ohne Dummy und zusätzliche DOIFs aber wenn's tut...

Wie geschrieben: prüfen wer schickt und auch sonst absichern nicht vergessen...

Gruß, Joachim
Titel: Antw:Status von Lampen über Telegram abfragen
Beitrag von: Stefan_Anfänger am 25 Februar 2018, 20:54:25
Ich habe jetzt doch die erste Variante genommen und der Anfang ging auch sehr einfach. Jetzt sitze ich schon wieder fest.

define openedWindows_dialog DOIF
### Fenster ###
([Michael_Telegram:msgText:"(^\/Fenster$)"])(
  ({my @windows = devspec2array('model=HM-SEC-SC(-\d)?:FILTER=state!=closed');;
    my $msg = "Es sind folgenede Fenster geöffnet:\n";;

    if (@windows > 0 and defined($defs{$windows[0]})){
      foreach (@windows){
        $msg .= "\n".AttrVal($_, "alias", $_);;
      }
    }else{
      $msg = "Es sind alle Fenster geschlossen.";;
    }
    $msg .= "\n
             \n/heimdall
            ";;
 
    fhem("set myTelegramBot message \@[myTelegramBot:msgPeerId] $msg");;
   }
  ),
  sleep 0.001; setreading openedWindows_dialog state send status
)


Ich wollte diesen Code für eine Lampe umschreiben, habe es auch ungefähr alles verstanden, aber der Array macht mir Probleme. Ich bekomme in leider nicht raus.
Es wäre nett, wenn mir jemand hilft.
Titel: Antw:Status von Lampen über Telegram abfragen
Beitrag von: MadMax-FHEM am 25 Februar 2018, 21:02:56
Ich muss gestehen so genau verstehe ich nicht was du willst bzw. wo (genau) das Problem ist...

Ich kann später ja mal einstellen was ich gemacht habe, vielleicht hilft das...

Zumindest kann ich dann besser helfen weil ich zumindest meinen Teil verstehe... ;)

Gruß, Joachim
Titel: Antw:Status von Lampen über Telegram abfragen
Beitrag von: MadMax-FHEM am 25 Februar 2018, 23:55:25
So hier mal was ich habe.

Nicht mehr aktuell, will heißen das geht mitlerweile sehr viel "schöner" aber für mich reicht das (noch) ;)

Notify auf die Nachricht:


define nTelegramBotDialogs notify myTelegramBot:msgText:.* {my_Chatbot(ReadingsVal($NAME,"msgPeerId","na"), ReadingsVal($NAME,"msgText","na"))}



In myUtils:


sub my_Chatbot($$)
{
  my ($MessagePeerID, $Message) = @_;
  my $Answer = "Sorry, did not find what you were looking for...";

# check for right Peer: example 123456789
  if($MessagePeerID ne "123456789")
  {
    Log 1, "my_Chatbot    illegal call Name: $Name      PeerID: $MessagePeerID      Message: $Message";
    return;
  }

# everything to lower case
  $Message = lc $Message;

# message is: co2_status?
  if($Message eq "co2_status")
  {
    $Answer = "CO2: " . ReadingsVal("myCO2", "CO2", "na") . "\n";
    $Answer .= "Luftdruck: \n    aktuell: " . ReadingsVal("httpmodLuftdruck", "Luftdruck", "na") . " hPa\n";
    $Answer .= "    historie: " . ReadingsVal("httpmodLuftdruck", "statLuftdruckDayAvgLast", "na") . " hPa\n";

    $Answer .= "Luftfeuchte-Ø: " . my_HumidityAverage() . "%\n";

    $Answer .= "Außen:\n    Ist-Temp: " . ReadingsVal("Aussenthermometer", "temperature", "na") . "°C\n    Luft: " . ReadingsVal("Aussenthermometer", "humidity", "na") . "%\n Taupunkt: " . ReadingsVal("Aussenthermometer", "dewpoint", "na") . "°C\n";
  }
  fhem("set $myTelegramBot message $Answer");
}


Wobei das jetzt eigentlich eine (sehr) abgespeckte Variante ist.

Also in wirklichkeit prüfe ich in der Chatbot Sub, nur die PeerID und dann ob ein '?' gekommen ist.
Wenn ein '?' angekommen ist schicke ich mir ein "Menü" mit möglichen Befehlen.

Alles was vom richtigen Peer kommt  aber kein Fragezeichen ist gebe ich dann an die Sub "ProcessMessage" weiter.
Dort prüfe ich dann welcher Befehl angekommen ist und verfahre dann wie in der hier geposteten Chatbot Sub ( if($Message eq "co2_status")  )...

Mittels weiterer if bzw. elsif prüfe ich dann die angekommene Message und bearbeite dann was gekommen ist, also welcher der möglichen Befehle ankam...
...und antworte (falls eine Antwort erfolgen soll) ansonsten wird nur der Befehl ausgeführt (beispielsweise: fhem("set Licht on")  ).

Aber sollte eigenltich so ähnlich wie im ersten Link sein...
...denke/dachte ich.

Gruß, Joachim