NEWS
[gelöst] Briefkastenscript: Umzug von der CCU auf ioBroker
-
Hi zusammen!
Ich hab mehr oder weniger ein kleines Problem.
Ich möchte nach und nach meine Scripte von der CCU umziehen lassen auf ioBroker.
Jetzt hab ich da so eines das nicht so will wie ich gerne möchte.
Ich habe zuhause meinen Briefkasten mit 2 Mikroschalter ausgestattet und an einem Arduino (homeduino von stall.biz) hängen.
Der sendet dann an die CCU den Zustand ob die Einwurfklappe geöffnet wurde und ob ne Entleerung stattgefunden hat. Es werden also 2 Systemvariablen (Typ: boolean) bei Öffnung auf false gesetzt.
Überwacht wird das auf der CCU mit folgendem Script:
string message; integer inserts; ! Setzen der Priorität für die Push-Nachricht dom.GetObject("CCU SV Push Prio").State("0"); ! +++++ Auswahl des Push-Dienstes (1: Pushover, 2: Prowl, 3: Pushalot, 4: alle) +++++ if(dom.GetObject("CCU SV Push-Dienst").Value() != 0){ dom.GetObject("CCU SV Push-Dienst").State(1); } ! Sound für Pushover-Nachricht dom.GetObject("CCU SV Pushover Sound").State("bugle"); ! Nachricht "Post ist da" an Dreambox 600PVR senden dom.GetObject("CUxD.CUX2801001:2.CMD_EXEC").State("wget -q -O /dev/null 'http://192.168.178.90/cgi-bin/xmessage?caption=Postkasten&timeout=0&body=Post%20ist%20da%20!!!&=1'"); ! Briefkasten-Einwürfe um Eins erhöhen inserts = dom.GetObject("EG Briefkasten SV Einwürfe").Value().ToInteger(); inserts = inserts + 1; dom.GetObject("EG Briefkasten SV Einwürfe").Variable(inserts).ToString(0); ! Anzeige "Post ist da" auf LED16-Statusdisplay dom.GetObject("BidCos-RF.JEQ0087074:15.LED_STATUS").State(3); ! Erzeugen der Nachricht message = "Briefkasten leeren, "; if(inserts == 1) { message = message # "1 Einwurf!"; } if(inserts > 1) { message = message # "" # inserts # " Einwürfe!"; } dom.GetObject("CCU SV Push Text").State(message); ! Programm "CCU PRG Push-Nachrichten" ausführen dom.GetObject("CCU PRG Push-Nachrichten").ProgramExecute(); ! Ansage "Post ist da" am Flur-Tablet über Home24-Mediaplayer string url="'http://192.168.178.70:50000/tts=Post ist da'"; dom.GetObject("CUxD.CUX2801001:14.CMD_EXEC").State("wget -q -O - "#turl);
Das Script erfasst den Einwurf, die Anzahl der Einwürfe, sendet eine Nachricht an meine Dreambox und löst eine Ansage über Home24-Mediaplayer auf dem Tab aus.
Desweiteren bekomme ich dann noch eine Pushnachricht über eine Zentrales Nachrichtenprogramm von dtp aus m Homematicforum.
Und hier mein Versuch in Javascript auf ioBroker
/* Programm zum Erfassen der Briefkasteneinwürfe */ var logging = true; var instanz = 'javascript.0'; instanz = instanz + '.'; var pfad = 'Briefkasten.'; var idSayIt = 'sayit.0.tts.text'; var lautstaerke = 100; var ansagetext = "Post ist da."; /* Erzeugen der nötigen Datenpunkte */ createState(pfad + 'Briefkasten_gefuellt', true, {read: true, write: true, type: 'boolean', name: 'Briefkasten voll in VIS Widget anzeigen', desc: 'Steuervariable für VIS Widget Sichtbarkeit'}); createState(pfad + 'Briefeinwurf_zaehlen', 0, {read: true, write: true, type: 'number', name: 'Briefeinwürfe zählen', desc: 'Counter für Briefeinwürfe'}); createState(pfad + 'Briefkastensperre', false, {read: true, write: true, type: 'boolean', name: 'Briefkastensperre', desc: 'Sperrt die Zählung der Einwürfe für eine festgelegte Zeit'}); /* Deklarieren der Benachrichtigungsdienste */ function meldung_push (text, titel, prio, sound, device) { sendTo("pushover", { message: text, title: titel, priority: prio, sound: sound, device: device }); } function meldung_email (from, to, subject, html) { sendTo("email", { from: from, to: to, subject: subject, html: html }); } function meldung_telegram (text, chatID ) { sendTo('telegram.0', { text: text, chatID: chatID }); } /* Abfragen eingestellten Nachrichten-Dienst */ /* aus=0 ; alle=1 ; Pushover=2 ; Telegram=3 ; eMail=4 */ var pushdienst = 'hm-rega.0.31934'; var pushprio = 0; var idSound = 'bugle'; var idDevice = 'htc10'; // Eingabe Gerät die die Pushnachricht erhalten soll var idChatID = '<eingabechatid-telegram>'; var idEmailVon = "<eingabe emailadress="">"; var idEmailAn = "<eingabe emailadress="">"; /* Variablen deklarieren */ var idBriefkasteneinwurf = 'hm-rega.0.15056'; var idBriefentnahme = 'hm-rega.0.15057'; // var idBriefkasteneinwurf = 'javascript.0.Briefeinwurf_Taster'; // var idBriefentnahme = 'javascript.0.Briefentnahme_Taster'; var idCountEinwurf = instanz + pfad + 'Briefeinwurf_zaehlen'; var idSperre = instanz + pfad + 'Briefkastensperre'; var idShowPostIcon = instanz + pfad + 'Briefkasten_gefuellt'; on({id: idBriefkasteneinwurf, val: false}, function (obj) { var counter = getState(idCountEinwurf).val; // Einwurfcounter einlesen var sperre = getState(idSperre).val; // Zustand Briefkastensperre einlesen setState(idShowPostIcon, true); // Icon für Briefkasteneinwürfe setzen setState(idSayIt, lautstaerke + ";" + ansagetext); // Ansagetext über Tablet /* MessageBox auf der Dreambox öffnen mit Anzeigetext "Post ist da" */ // exec('wget -q -O /dev/null http://192.168.178.90/cgi-bin/xmessage?caption=Postkasten&timeout=0&body=Post%20ist%20da%20!!!&=1', function (error, stdout, stderr) {console.log('stdout: ' + stdout);}); if(sperre === false){ setState(idCountEinwurf, ++counter); // Einwurf um eins hochzählen if(counter === 1){ Briefkastenmeldung(); // Nachrichtendienste auslösen } else if(counter > 1){ // if((getState(idCountEinwurf).val) > 1){ BriefkastenmeldungMehrzahl(); // Nachrichtendienste auslösen } setState(idSperre, true); // Briefkastensperre aktivieren setStateDelayed(idSperre, false, 30000); // Briefkastensperre nach 30sec wieder deaktivieren } }); on({id: idBriefentnahme, val: false}, function (obj) { var clearpost = instanz + pfad + 'Briefeinwurf_zaehlen'; setState(clearpost, 0); // Briefkasteneinwürfe löschen setState(idShowPostIcon, false); // Icon für Briefkasteneinwürfe deaktivieren Briefkastenentleerung(); }); /* ######################## Funktion für Meldung bei einem Einwurf ################################ */ function Briefkastenmeldung() { /* Variablen befüllen */ var Einwurfanzahl = ((getState(idCountEinwurf).val) +1); /* ##################################### */ var betreff = 'Briefkastenmeldung'; var meldung = 'Briefkasten: ' + Einwurfanzahl + ' Einwurf! \n\n' + 'ioBroker'; var meldung1 = 'Briefkasten: ' + Einwurfanzahl + ' Einwurf! \n\n' + 'ioBroker'; var meldunghtml = ' <u>Briefkastenmeldung</u> ' + 'Briefkasten: ' + Einwurfanzahl + ' Einwurf!' + ' ' + ' ' + ' ' + 'ioBroker' + '</eingabe></eingabe></eingabechatid-telegram> ```'; /* Nachrichteninhalt für Pushover*/ var sound = idSound; var device = idDevice; var ID = idChatID; if ( (getState(pushdienst).val === 2) || (getState(pushdienst).val === 1) ) { meldung_push(meldung, betreff, pushprio, sound, device); } if ( (getState(pushdienst).val === 3) || (getState(pushdienst).val === 1) ) { meldung_telegram(meldung1, ID); } /* Nachrichteninhalt an email übertragen */ var von = idEmailVon; var an = idEmailAn; if ( (getState(pushdienst).val === 1) || (getState(pushdienst).val === 4) ) { meldung_email(von, an, betreff, meldunghtml); } if (logging) log('Anzahl Briefkasteneinwürfe an Nachrichtendienst übertragen'); } /* ############################################################################################# */ /* ############ Funktion für Meldung bei mehr als einem Einwurf ################################ */ function BriefkastenmeldungMehrzahl() { /* Variablen befüllen */ var Einwurfanzahl1 = ((getState(idCountEinwurf).val) +1); /* ##################################### */ var betreff1 = 'Briefkastenmeldung'; var meldung1 = 'Briefkasten: ' + Einwurfanzahl1 + ' Einwürfe! \n\n' + 'ioBroker'; var meldung11 = 'Briefkasten: ' + Einwurfanzahl1 + ' Einwürfe! \n\n' + 'ioBroker'; var meldunghtml1 = ' <u>Briefkastenmeldung</u> ' + 'Briefkasten: ' + Einwurfanzahl1 + ' Einwürfe!' + ' ' + ' ' + ' ' + 'ioBroker' + ''; /* Nachrichteninhalt für Pushover*/ var sound1 = idSound; var device1 = idDevice; var ID1 = idChatID; if ( (getState(pushdienst).val === 2) || (getState(pushdienst).val === 1) ) { meldung_push(meldung1, betreff1, pushprio, sound1, device1); } if ( (getState(pushdienst).val === 3) || (getState(pushdienst).val === 1) ) { meldung_telegram(meldung11, ID1); } /* Nachrichteninhalt an email übertragen */ var von1 = idEmailVon; var an1 = idEmailAn; if ( (getState(pushdienst).val === 1) || (getState(pushdienst).val === 4) ) { meldung_email(von1, an1, betreff1, meldunghtml1); } if (logging) log('Anzahl Briefkasteneinwürfe an Nachrichtendienst übertragen'); } /* ############################################################################################# */ /* ###################### Funktion für Meldung bei Entleerung ################################## */ function Briefkastenentleerung() { /* Variablen befüllen */ var betreff2 = 'Briefkastenmeldung'; var meldung2 = 'Briefkasten wurde entleert! \n\n' + 'ioBroker'; var meldung12 = 'Briefkasten wurde entleert! \n\n' + 'ioBroker'; var meldunghtml2 = ' <u>Briefkastenmeldung</u> ' + 'Briefkasten wurde entleert!' + ' ' + ' ' + ' ' + 'ioBroker' + ''; /* Nachrichteninhalt für Pushover*/ var sound2 = idSound; var device2 = idDevice; var ID2 = idChatID; if ( (getState(pushdienst).val === 2) || (getState(pushdienst).val === 1) ) { meldung_push(meldung2, betreff2, pushprio, sound2, device2); } if ( (getState(pushdienst).val === 3) || (getState(pushdienst).val === 1) ) { meldung_telegram(meldung12, ID2); } /* Nachrichteninhalt an email übertragen */ var von2 = idEmailVon; var an2 = idEmailAn; if ( (getState(pushdienst).val === 1) || (getState(pushdienst).val === 4) ) { meldung_email(von2, an2, betreff2, meldunghtml2); } if (logging) log('Briefkastenentleerung an Nachrichtendienst übertragen'); } /* ############################################################################################# */` Aber irgendwie klappt das nicht. Wenn ich das Sript manuell (mit viertuellen Tastern) auslöse dann gehts!
// var idBriefkasteneinwurf = 'javascript.0.Briefeinwurf_Taster',
// idBriefentnahme = 'javascript.0.Briefentnahme_Taster',Aber nicht über triggern der Systemvariablen vom Homeduino. Kann mir da jemand vielleicht weiterhelfen? Gruß Johnny
-
Hallo Johnny,
das Skript ist ja ein ganz schönes Monster
Da mal eben schnell zu schauen, wo der Fehler liegt, ist relativ schwierig.
Aber du hast ja das Problem schon weiter eingegrenzt.
@PrinzEisenherz1:Wenn ich das Sript manuell (mit viertuellen Tastern) auslöse dann gehts!
…
Aber nicht über triggern der Systemvariablen vom Homeduino. `
Ich würde also erstmal in einem zweiten Test-Skript ausprobieren, ob die Homeduino-gesetzten Variablen in ioBroker erkannt werden. Ganz klein:var idHomeduino1= 'hm-rega.0.15056'; var idHomeduino2 = 'hm-rega.0.15057'; on(idHomeduino1, function (data) { log('Homeduino 1: ' + data.state.val); }); on(idHomeduino2, function (data) { log('Homeduino 2: ' + data.state.val); });
Und ich würde darüber nachdenken, die Daten des Homeduino ohne den Umweg über die CCU direkt an ioBroker zu senden. Dafür ist ioBroker schließlich da.
Gruß
Pix
-
Hi Pix
Lach..n kleines Script ist es wirklich nicht geworden.
Ich hab hald gedacht ich lagere die Dinge für Nachrichtenversenden in Funktionen aus und die sind am Ende vom Script.
Ich werde heute Abend mal Dein kleines Testscript probieren.
Das mit dem Homeduino direkt an ioBroker ist auch ne interessante Idee, da muss ich dann erstmal den Sketch umschreiben das er mir die Daten an ioBroker sendet.
Ist das mit dem counter und der Sperrzeit in meinem Script so machbar?
hier der Auszug
on({id: idBriefkasteneinwurf, val: false}, function (obj) { var counter = getState(idCountEinwurf).val; // Einwurfcounter einlesen var sperre = getState(idSperre).val; // Zustand Briefkastensperre einlesen setState(idShowPostIcon, true); // Icon für Briefkasteneinwürfe setzen setState(idSayIt, lautstaerke + ";" + ansagetext); // Ansagetext über Tablet /* MessageBox auf der Dreambox öffnen mit Anzeigetext "Post ist da" */ // exec('wget -q -O /dev/null http://192.168.178.90/cgi-bin/xmessage?caption=Postkasten&timeout=0&body=Post%20ist%20da%20!!!&=1', function (error, stdout, stderr) {console.log('stdout: ' + stdout);}); if(sperre === false){ setState(idCountEinwurf, ++counter); // Einwurf um eins hochzählen if(counter === 1){ Briefkastenmeldung(); // Nachrichtendienste auslösen } else if(counter > 1){ BriefkastenmeldungMehrzahl(); // Nachrichtendienste auslösen } setState(idSperre, true); // Briefkastensperre aktivieren setStateDelayed(idSperre, false, 30000); // Briefkastensperre nach 30sec wieder deaktivieren } });
Gruß
Johnny
-
Hallo Johnny,
Ja das sollte mit der Sperre gehen. Alternativ gibt es auf der Seite ccu.io unter Script ein Beispiel für ein Briefkastenzähler mit Sperre.
Die Unterscheidung nach einer oder mehreren Einwürfen kannst du auch in der zielfunktion abfragen, wenn du die Zahl mit übergibst. Das spart Code.
Briefkastenmeldung(counter); funktion Briefkastenmeldung(anzahl) { if (anzahl > 1) log("es gibt eine neue Nachricht'); Else // ... }
Gruß
Pix
-
Hi Pix!
Jetzt klappt es! Hab den Arduino so umkonfiguriert das er direkt mit ioBroker spricht!
Das Script hab ich auch noch etwas eingekürzt!
! ````
/* ##### Programm zum Erfassen der Briefkasteneinwürfe ########/
/ #### Verfasst durch Schneider Johann (PrinzEisenherz1) #######*/
var logging = false;
var instanz = 'javascript.0'; instanz = instanz + '.';
var pfad = 'Briefkasten.';
var idSayIt = 'sayit.0.tts.text';
var lautstaerke = 100;
var ansagetext = "Post ist da.";
var betreff = 'Briefkastenmeldung';
var von = "eMail-Adresse"; // Absender
var an = "eMail-Adresse"; // Empfänger/* Erzeugen der nötigen Datenpunkte */
createState(pfad + 'Briefkasten_gefuellt', true, {read: true, write: true, type: 'boolean', name: 'Briefkasten voll in VIS Widget anzeigen', desc: 'Steuervariable für VIS Widget Sichtbarkeit'});
createState(pfad + 'Briefwürfe_zaehlen', 0, {read: true, write: true, type: 'number', name: 'Briefwürfe zählen', desc: 'Counter für Briefwürfe'});
createState(pfad + 'Briefkastensperre', false, {read: true, write: true, type: 'boolean', name: 'Briefkastensperre', desc: 'Sperrt die Zählung der Einwürfe für eine festgelegte Zeit'});! /* Abfragen eingestellten Nachrichten-Dienst /
/ aus=0 ; alle=1 ; Pushover=2 ; Telegram=3 ; eMail=4 */
var pushdienst = 'hm-rega.0.32673';
var pushprio = 0;
var idSound = 'bugle';
var idDevice = '';
var TelegramID = 'ChatID';/* ############## Variablen deklarieren ############################# /
var idBriefkasteneinwurf = 'javascript.0.Technikraum.Homeduino.homeduino_001_D27';
var idBriefentnahme = 'javascript.0.Technikraum.Homeduino.homeduino_001_D26';
var idCountEinwurf = instanz + pfad + 'Briefwürfe_zaehlen';
var idSperre = instanz + pfad + 'Briefkastensperre';
var idShowPostIcon = instanz + pfad + 'Briefkasten_gefuellt';
/ ######################################################### */! /* Deklarieren der Benachrichtigungsdienste /
function meldung_push (text, titel, prio, sound, device) {
sendTo("pushover", {
message: text,
title: titel,
priority: prio,
sound: sound,
device: device
});
}
function meldung_email (from, to, subject, html) {
sendTo("email", {
from: from,
to: to,
subject: subject,
html: html
});
}
function meldung_telegram (text, chatID ) {
sendTo('telegram.0', {
text: text,
chatID: chatID
});
}
! on({id: idBriefkasteneinwurf, val: 0},
function (obj) {
var counter = getState(idCountEinwurf).val; // bisherige Zahl aus Variable einlesen
var sperre = getState(idSperre).val; // Zustand Briefkastensperre einlesen
setState(idShowPostIcon, true); // Icon für Briefkasteneinwürfe setzen
setState('hm-rpc.0.JEQ0087074.15.LED_STATUS', 3); // LED16-Status Orange
if(sperre === false){
setState(idCountEinwurf, ++counter); // eins hochzählen
if(counter === 1){
Briefkastenmeldung(counter);
} else
if(counter > 1){
Briefkastenmeldung(counter);
}
setState(idSperre, true); // Briefkastensperre aktivieren
setStateDelayed(idSperre, false, 30000); // Briefkastensperre nach 30.000 ms wieder deaktivieren
}
});
! on({id: idBriefentnahme, val: 0},
function (obj) {
var clearpost = instanz + pfad + 'Briefwürfe_zaehlen'; // bisherige Zahl aus Variable einlesen
setState(clearpost, 0); // Briefkasteneinwürfe löschen
setState('hm-rpc.0.JEQ0087074.15.LED_STATUS', 2); // LED16-Status grün
setState(idShowPostIcon, false); // Icon für Briefkasteneinwürfe löschen
Briefkastenentleerung();
});
! / ################## Funktion für Meldung bei einem Einwurf ########################## /
function Briefkastenmeldung(anzahl) {
/ Variablen befüllen /
var Einwurfanzahl = ((getState(idCountEinwurf).val) +1);
/ ###### Ausgabe über SayIt und auf der Dreambox PVR600 ####### /
setState(idSayIt, lautstaerke + ";" + ansagetext); // Ansagetext über Tablet
require('request')("http://192.168.178.90/cgi-bin/xmessage?caption=Postkasten&timeout=0&body=Post&=1");
/ ##################################################################### */
var meldung = 'Briefkasten: ';
var meldunghtml = '
! <u>Briefkastenmeldung</u>
! ' +
'Briefkasten: ';
if (anzahl === 1){
meldung = meldung + Einwurfanzahl + ' Einwurf! \n\n'
+ 'ioBroker';
meldunghtml = meldunghtml + Einwurfanzahl + ' Einwurf!' + '
' + '
' + '
' +
'ioBroker' + '' + ' ' + ' ' + 'ioBroker' + ''; } /* Nachrichteninhalt für Pushover*/ if ( (getState(pushdienst).val === 2) || (getState(pushdienst).val === 1) ) { meldung_push(meldung, betreff, pushprio, idSound, idDevice); } if ( (getState(pushdienst).val === 2) || (getState(pushdienst).val === 3) || (getState(pushdienst).val === 1) ) { meldung_telegram(meldung, TelegramID); } /* Nachrichteninhalt an email übertragen */ if ( (getState(pushdienst).val === 1) || (getState(pushdienst).val === 4) ) { meldung_email(von, an, betreff, meldunghtml); } if (logging) log('Anzahl Briefkasteneinwürfe an Pushover und eMail übertragen'); } /* ############### Funktion für Meldung bei Entleerung ###################### */ function Briefkastenentleerung() { /* Variablen befüllen */ var meldung2 = 'Briefkasten wurde entleert! \n\n' + 'ioBroker'; var meldunghtml2 = ' >! <u>Briefkastenmeldung</u> >! ' + 'Briefkasten wurde entleert!' + ' ' + ' ' + ' ' + 'ioBroker' + ''; /* Nachrichteninhalt für Pushover*/ if ((getState(pushdienst).val === 2) || (getState(pushdienst).val === 1) ) { meldung_push(meldung2, betreff, pushprio, idSound, idDevice); } if ((getState(pushdienst).val === 2) || (getState(pushdienst).val === 3) || (getState(pushdienst).val === 1) ) { meldung_telegram(meldung2, TelegramID); } /* Nachrichteninhalt an email übertragen */ if ((getState(pushdienst).val === 1) || (getState(pushdienst).val === 4) ) { meldung_email(von, an, betreff, meldunghtml2); } if (logging) log('Briefkastenentleerung an Pushover und eMail übertragen'); }` Sieht hoffentlich jetzt besser aus? *fg* Nochmal vielen Dank! Johnny