Neues Modul: Signalbot (Integration für den Signal Messenger) via signal-cli

Begonnen von Adimarantis, 31 Januar 2021, 19:16:19

Vorheriges Thema - Nächstes Thema

enno

Hier das  DOIF vereinfacht aber damit wird das Problem klar: defmod di_Test DOIF ([Testdummy:state] eq "on")(set SIGNAL send <i>Text Zweite Zeile</i>)
Ergebnis: Cursiv so wie es sein soll. Mit Zeilenumbruch: defmod di_Test DOIF ([Testdummy:state] eq "on")(set SIGNAL send <i>Text \nZweite Zeile</i>) oder auch mit \\n klappt nicht.

Gruss
  Enno

Einfacher FHEM Anwender auf Intel®NUC

Adimarantis

Jetzt hab ichs verstanden...
Fix auf github und auch <br> sollte jetzt gehen
Markdown hab ich jetzt auf doppelte Zeichen (__ ~~ **) geändert - das mit dem Pflichtleerzeichen fand ich nicht gut

Jörg

Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

enno

Moin Jörg,
set SIGNAL send <i>Text <br>Zweite Zeile</i>

Klappt! Super, gefallen mir sehr gut die neuen Möglichkeiten.

Gruss
  Enno
Einfacher FHEM Anwender auf Intel®NUC

Adimarantis

Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

enno

Ich würde ja gerne bei Bedarf den Inhalt eines Textfile schicken :) Also nicht als Anhang, sondern direkt als Text lesbar 8)
set SIGNAL send  §/opt/fhem/log/fhem.log

Zur Zeit importiere ich mir das als Reading in ein Dummy und schicke dann die Reading in einem DOIF.

Gruss
  Enno
Einfacher FHEM Anwender auf Intel®NUC

andies

Ich lasse mir immer die letzten 20 Zeilen der letzten beiden Tage schicken
sub LogFileEintraegeSenden(){
# Datum holen
my $datum = POSIX::strftime("%Y-%m",localtime(time));
my $today_log = POSIX::strftime("%Y.%m.%d",localtime(time));
my $yesterday_log = POSIX::strftime("%Y.%m.%d",localtime(time-24*60*60));

my $nachricht = "";
my ($err, @nachrichtenliste) = FileRead({FileName => "/opt/fhem/log/fhem-$datum.log", ForceType => "file"});
if ($err) {
$nachricht = "Fehler beim Lesen der Logdatei /opt/fhem/log/fhem-$datum.log: $err";
} else {
# Eintraege mit anderem Datum entfernen
my @datatosend;
    if (@nachrichtenliste > 19) {
      @datatosend = @nachrichtenliste[-20..-1];
    } else {
      @datatosend = @nachrichtenliste;
}

foreach my $nachrichtenzeile(@datatosend){
$nachrichtenzeile =~ s/[;&><]//g;  ##Semikolon entfernen, siehe https://core.telegram.org/bots/api#markdown-style
#Log3(undef, 0, "substr= ".substr($nachrichtenzeile, 0, 10))."#";
#Log3(undef, 0, "today= ".$today_log)."#";
if ((substr($nachrichtenzeile, 0, 10) eq $today_log) or (substr($nachrichtenzeile, 0, 10) eq $yesterday_log)){
$nachricht .= substr($nachrichtenzeile, 11)."\n";
    }
}
}
fhem("set SignalBot send \@Andreas &uiDOIF,1 &uiDOIF,2 &uiDOIF,3") ;
$nachricht =~ tr/a-zA-Z0-9/\x{1D68A}-\x{1D6A3}\x{1D670}-\x{1D689}\x{1D7F6}-\x{1D7FF}/;
fhem("set SignalBot send \@Andreas Logfile\n".$nachricht);
}
FHEM 6.1 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Adimarantis

Neue Testversion mit Emoticons auf GitHub inklusive einer "get" Funktion die die Syntax anzeigt.

Du kannst durchaus ein Textfile schicken.
Ungünstig ist nur die Endung ".log" - da ist zumindest auf meinem Handy keine App verknüpft die Textfiles anzeigen kann.
Mit ".txt" funktioniert es aber gut und dann öffnet er z.B. Chrome

Mit dem FHEM log gibt es da noch ein Problem - es ist wahrscheinlich zu lang - ich war da nur mit sehr kleinen Files erfolgreich.

Also z.B. ein
system("tail -1000 ~fhem/log/fhem-2022-02.log >/tmp/tmp.txt")
ausführen und dann /tmp/tmp.txt verschicken - dann kriegt du die letzen 1000 Zeilen vom FHEM log. Das funktioniert bei mir noch.

Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

enno

Ich habe den Vorschlag von Andies aufgegriffen und für mich verkürzt da ich mit den Umlauten keine Probleme hatte:

sub LogFileEintraegeSenden(){
my $nachricht = "";
my ($err, @nachrichtenliste) = FileRead({FileName => "/opt/fhem/log/fhem.log", ForceType => "file"});
if ($err) {
$nachricht = "Fehler beim Lesen der Logdatei /opt/fhem/log/fhem.log: $err";
} else {
my @datatosend;
    @datatosend = @nachrichtenliste;
foreach my $nachrichtenzeile(@datatosend){
$nachrichtenzeile =~ s/[;&><]//g;  ##Semikolon entfernen, siehe https://core.telegram.org/bots/api#markdown-style
$nachricht .= substr($nachrichtenzeile, 11)."<br>";
}
}
fhem("set SIGNAL send LOG<br><code>".$nachricht."</code>");
}


Dann im DOIF { LogFileEintraegeSenden() } aufrufen. Ist deutlich eleganter als meine alte Variante.

Damit klappt es, die Log sind bei mir im Normalfall aber auch nicht besonders lang.

Gruss
  Enno
Einfacher FHEM Anwender auf Intel®NUC

enno

Emoticons funktioniert bei mir, wenn ich Attribut formatting both stehen habe. Bei HTML allein natürlich nicht :D

Gruss
  Enno
Einfacher FHEM Anwender auf Intel®NUC

SouzA

Hallo liebe Leute,

erst einmal vielen Dank für dieses tolle Modul.

Dennoch habe ich dazu nun einmal eine Frage.
Folgendes sendet mir den Alias des auslösenden Devices auf Signal:
(set Signalbot send @SouzA {(AttrVal("$DEVICE","alias",""))})

Wenn ich aber
(set Signalbot send @SouzA Irgendeintext zum Beispiel {(AttrVal("$DEVICE","alias",""))} mit Gemüse)

Dann kommt nur
Irgendeintext zum Beispiel
in Signal an.

Wie kriege ich es hin, dass der ALIAS mit dem Text zu Signal gesendet wird?
Vielen Dank für eine kurze Rückmeldung.

Thx und bis denn
SouzA
Raspi 4, EnOcean TCM310 USB, HM-MOD-UART-USB, Jeelink, hue, AMAD, fully, FRITZBOX, Signalbot, VIERA, Presence BT/Mac, TPLink, Gassistant, Shelly, fhempy, ZigBee

Adimarantis

Hast du dazu noch etwas mehr Kontext (das komplette Device oder zumindest genug, dass ich das bei mir nachbauen kann?)
Wo führst du das aus?
Das Problem dürfte sein, das $DEVICE zum Zeitpunkt der Auswertung nicht (mehr) gesetzt ist.
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

SouzA

Zitat von: Adimarantis am 06 Februar 2022, 20:50:02
Hast du dazu noch etwas mehr Kontext (das komplette Device oder zumindest genug, dass ich das bei mir nachbauen kann?)
Wo führst du das aus?
Das Problem dürfte sein, das $DEVICE zum Zeitpunkt der Auswertung nicht (mehr) gesetzt ist.
Öhm... was soll ich sagen?
Habe es gerade noch mal getestet. Jetzt geht es auf einmal? Obwohl ich !!nix!! an den Netzwerken geändert habe! ????
Kein Plan, was jetzt anders ist als vorher....

Sorry, ich ziehe alles zurück und behaupte das Gegenteil.

Mit dem nicht gesetzten Device hat es nix zu tun... die waren definitiv gesetzt.
Das waren gesetzte SPS-Ausgänge... die gehen nicht einfach wieder weg.

Thx und bis denn
SouzA
Raspi 4, EnOcean TCM310 USB, HM-MOD-UART-USB, Jeelink, hue, AMAD, fully, FRITZBOX, Signalbot, VIERA, Presence BT/Mac, TPLink, Gassistant, Shelly, fhempy, ZigBee

Adimarantis

Version 3.7 mit Formatierungen und Emoticons ist jetzt über Update verfügbar.

Bitte unbedingt "update all" und "shutdown restart" machen, da die Formatierungssfunktionen in lib/FHEM/Text/Unicode.pm ausgelagert wurden und diese nur so korrekt eingebunden werden.

Aktiviert wird die Funktion über das "formatting" Attribut. Details zur Syntax bekommt man mit "get uniCode".

Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

cwagner

Das Modul hat ja wirklich Super-Fortschritte gemacht und mit dem Install-Script ist es nach meiner Erfahrung auch super-einfach geworden, es zu aktivieren.
In der Praxis stoße ich aber dann auf ein Verständnisproblem:
Dieses Doif (bei dem ich den Vergleichsoperaator jetzt zum Testen extra verdreht habe)

defmod DI_Tiefkuehl DOIF {if ([T_Tiefkuehltruhe:temperature] < -10) {fhem_set "Signal send \@XX Temperaturproblem Kuehltruhe: [T_Tiefkuehltruhe:temperature] Grad"}}

sendet diese Nachricht:
Temperaturproblem Kuehltruhe: ::ReadingValDoIf(HASH(0x6480108),T_Tiefkuehltruhe,temperature) Grad

es wird der Aufruf von Device:Reading nicht aufgelöst.
Was mache ich falsch. Verschiedene Maskierungen habe ich schon versucht, ohne Erfolg.
Signalbot ist auf der neuesten, per Repository erhältlichen Version.

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Adimarantis

Ersetzungen in DOIF sind tricky wenn man sie zu sehr verschachtelt.
Viele Wege führen nach Rom, z.B. indem du das Reading aus den Anführungszeichen rausholst:
defmod DI_Tiefkuehl DOIF {if ([T_Tiefkuehltruhe:temperature] < -10) {fhem_set "Signal send \@XX Temperaturproblem Kuehltruhe:".[T_Tiefkuehltruhe:temperature]." Grad"}}
oder es erst in eine Variable schreibst:
defmod DI_Tiefkuehl DOIF {if ([T_Tiefkuehltruhe:temperature] < -10) {my $var=[T_Tiefkuehltruhe:temperature]; fhem_set "Signal send \@XX Temperaturproblem Kuehltruhe: $var Grad"}}
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)