hi hab dir ne gif erstellt aber nicht getestet sollte aber gehen
viel glück

hi hab dir ne gif erstellt aber nicht getestet sollte aber gehen
viel glück

Hi , ich hab mal gleich ein passendes Script zusammen gefrickelt 
in die clientList müssen dann alle IPs deiner Endgeräte rein
const ping = require('ping');
const Promise = require('bluebird');
const clientList = [ '192.168.178.1','192.168.178.2','192.168.178.4'];
let aliveClients;
ping.sys.probeAsync =
function(host) {
return new Promise((resolve, reject) => {
ping.sys.probe(host, function(isAlive) {
resolve({"client": host, "status": isAlive});
});
})
}
aliveClients = clientList.map((client)=> ping.sys.probeAsync(client));
Promise.all(aliveClients).then(function(results) {
return {results: results, timestamp: new Date().getTime()};
}).then((results)=>{
let filterList = results.results.filter((obj) => obj.status == true);
let percentage = filterList.length *100/clientList.length;
if(percentage < 40.0)
sendTo('telegram.0', {
chatId : getState('telegram.0.communicate.requestChatId'/*Chat ID of last received request*/).val,
text: "wahrscheinlich strom weg!",
});
console.log( (percentage));
});
Hi,
ich habe eine kleines Script gebastelt welches mir ein Menü für Telegram baut hierfür werden die enums(Aufzählungen) in IOBroker verwendet.
In Telegram kann ich dann im Menü navigieren und bestimmt Funktionen ausführen tiggern.
Vielleicht kann es ja noch jemand gebrauchen...
Es muss der Telegramadapter installiert sein und die Aufzählungen entsprechend konfiguriert.
Zur Zeit gehen nur boolesche Schalter. Das Skript liegt in der index.js Datei diese müsst ihr einfach nur in euren IOBroker einfügen(copy & paste) und die Zeile 284 anpassen in der die Enums ausgewählt werden welche ihr entsprechend verwendet wollt.
Ich möchte anmerken das ich IOBroker noch nicht so lange verwende und ich mich noch zurecht finden muss
genauso beherrsche ich kein JavaScript hab es nur für dieses Projekt ein wenig angeeignet, Verbesserungsvorschläge nehme ich gerne an da ich vermute , dass man so einige Sachen in JavaScript besser umsetzen kann 
Ich hatte auch versucht mir ein npm paket zu erstellen und die eigentlichen Klassen in unterschiedliche Dateien zu separieren, bin dann aber an der
Integration beim IoBroker gescheitert und hab dann alles in einer Datei gelassen. Was mir nicht unbedingt gefällt , vielleicht könnte mir dabei jemand helfen?
oder müsste man daraus ein Adapter basteln?
https://github.com/Nahasapeemapetilon/MyTelegramMenu
Viele Grüße
@foodfighter ich glaub du machst es dir viel zu schwer statisch hin oder her.... der telegram adapter schickt wenn du keine user angibst pauschal eh an alle users ansonsten hat der adapter einen state users
den kannst du abfragen mit
getState('telegram.0.communicate.users'/).val;
der enthält alle users den könntest du verwenden , wenn du da einen user nicht verwendet willst filterst du einen raus oder nimmst ne eigene liste mit der entsprechenden IDs an den du du senden möchtest
zb.
sendTo('telegram.0', { text: "TestList",
chatId: "UserID1"});
Wenn du jetzt an alle User raus schreibst "wäsche aufhängen!"
mit z.b.
sendTo('telegram.0', { text: "Wäsche abhängen"});
und ein user antwortet "erledigt"
dann guckst du wer "erledigt" geschrieben hat, dass steht im State des Adapters
im Object : telegram.0.communicate.requestChatId
diese ID nimmst du um zu antworten:
let ID = getState('telegram.0.communicate.requestChatId').val;
sendTo('telegram.0', { text: "danke",
chatId:ID});
wenn du jetzt allen anderen user schreiben möchtest wurde abgehängt dann einfach die Liste der user filtern:
const allUsers =JSON.parse( getState('telegram.0.communicate.users').val);
const userIDs = Object.keys(allUsers);
let lastID = getState('telegram.0.communicate.requestChatId').val;
const filterList = userIDs.filter((id) => id != lastID);
filterList.forEach((id)=>{
sendTo('telegram.0',
{ text:"wude aufgehängt",
chatId:id});
});
viele grüße
Hi
dein erstes Skript fand ich ganz gut deshalb korrigiere ich das mal:
@thomson sagte in Shelly - Rollo via einen Taster:
if("open" || "close") { setState('shelly.0.SHSW-25#0045xx#1.Shutter.Pause'/*Pause*/,true);
die letzte Bedingung ist immer true und stoppt dann immer deine Rollofahrt gleich wieder
sollte vermutlich:
if(state==="open" || state ==="close")
heißen.
und bei dem ersten If müsste es wohl heißen >80, statt kleiner und aus der zweiten würde ich nen else if machen
und die dritte am besten gleich auch 
if(pos > 80 && state === "stop")
//.....
else if(pos <20 && state === "stop")
//...
Außerdem sind deine ID vom Shelly alle unterschiedlich, die sollten alle vom selben Shelly sein, falls du sie nicht absichtlich verfremdet hast....
bei deinem zweiten Skript steig ich gar nicht richtig durch was du machen willst wirkt irgendwie strange,kommen deine Konsolen ausgaben?
vermutlich ist die erste Bedingung schon nicht richtig.
@thomson sagte in Shelly - Rollo via einen Taster:
if((obj.state ? obj.state.val : "")) {
viele grüße
@MeinzIsAs sagte in Variablen in Schleifen anlegen:
for (var a = 1; i <= 3; a++) {
die schleife ist ne endlos schleife......i ist immer kleiner gleich 3 da du sie nicht erhöhst
vermutlich sollte es a<=3 heißen
Viele Grüße
Hi,
ich habe mal ein kleines Update eingespielt.



Hier mal eine kleine Animation vom Menü und Navigation

Das wars erst mal Viele Grüße 
@br0kly sagte in Türsensor, Text2command und Telegram:
Danke. Das Problem ist, dass diese "60 Sek"-Schleife endlos läuft, da die Abbruchbedingung außerhalb liegt und somit nie überprüft wird.
das stimmt nicht wenn du es so geplant hast wie in der gif, beendet er die meldung wenn du das fenster zumachst.
das sieht man auch gut im code , da die intervall variable außerhalb der zwei events(schließen /öffnen) deklariert wird.
var Intervall;
on({id: 'zigbee.0.00158d00025312b0.opened', val: true}, function (obj) {
var value = obj.state.val;
var oldValue = obj.oldState.val;
sendTo("telegram.0", "send", {
text: 'Fenster offen!'
});
Intervall = setInterval(function () {
sendTo("telegram", "send", {
text: 'Fenster zu machen'
});
}, 60000);
});
on({id: 'zigbee.0.00158d00025312b0.opened', val: false}, function (obj) {
var value = obj.state.val;
var oldValue = obj.oldState.val;
sendTo("telegram.0", "send", {
"parameter1": 'Fenster zu'
});
(function () {if (Intervall) {clearInterval(Intervall); Intervall = null;}})();
});
@br0kly die objekt id für schließen scheint ne andere als beim öffnen zu sein....
@agreen
ich würde versuchen den bot erstmal als admin in der gruppe zu erzeugen :

und danach musst du wohl oder übel den passwortschutz entfernen (iobroker)
@agreen ist dein Bot - Admin in der Gruppe?

@foodfighter ich glaub du machst es dir viel zu schwer statisch hin oder her.... der telegram adapter schickt wenn du keine user angibst pauschal eh an alle users ansonsten hat der adapter einen state users
den kannst du abfragen mit
getState('telegram.0.communicate.users'/).val;
der enthält alle users den könntest du verwenden , wenn du da einen user nicht verwendet willst filterst du einen raus oder nimmst ne eigene liste mit der entsprechenden IDs an den du du senden möchtest
zb.
sendTo('telegram.0', { text: "TestList",
chatId: "UserID1"});
Wenn du jetzt an alle User raus schreibst "wäsche aufhängen!"
mit z.b.
sendTo('telegram.0', { text: "Wäsche abhängen"});
und ein user antwortet "erledigt"
dann guckst du wer "erledigt" geschrieben hat, dass steht im State des Adapters
im Object : telegram.0.communicate.requestChatId
diese ID nimmst du um zu antworten:
let ID = getState('telegram.0.communicate.requestChatId').val;
sendTo('telegram.0', { text: "danke",
chatId:ID});
wenn du jetzt allen anderen user schreiben möchtest wurde abgehängt dann einfach die Liste der user filtern:
const allUsers =JSON.parse( getState('telegram.0.communicate.users').val);
const userIDs = Object.keys(allUsers);
let lastID = getState('telegram.0.communicate.requestChatId').val;
const filterList = userIDs.filter((id) => id != lastID);
filterList.forEach((id)=>{
sendTo('telegram.0',
{ text:"wude aufgehängt",
chatId:id});
});
viele grüße
@jwerlsdf ich hab es mal selber zum testen nachgebaut
so sieht es bei mir aus:
folgende States hinzugefügt :

Die Auflistung liste sah bei mir so aus :

und dann noch kleines TestScript dazu:
let myShoppingList = [];
on({id: 'javascript.0.TestEinkaufsliste' ,
change: 'any'}, (pMeldung) => {
if(pMeldung.state.val)
myShoppingList.push(pMeldung.state.val);
console.log(["Einkaufsliste :",myShoppingList]);
});
on({id: 'javascript.0.TestEinkaufsListeRemoveAll',
change: 'any'}, (pMeldung) => {
if(myShoppingList.length > 0)
myShoppingList = [];
console.log(["Einkaufsliste :",myShoppingList]);
});
on({id: 'javascript.0.TestEinkausListeRemoveItem'/*Eintrag löschen*/ ,
change: 'any'}, (pMeldung) => {
console.log([pMeldung.state.val,myShoppingList.length]);
if(pMeldung.state.val>=0 && pMeldung.state.val <= myShoppingList.length)
myShoppingList = myShoppingList.splice(pMeldung.state.val,1);
console.log(["Einkaufsliste :",myShoppingList]);
});
geht zwar, ich find es aber bisschen "bucklig"
vielleicht sollte man nen speziellen Modi "Einkaufsliste" in das TelegramMenü einbauen,
da könnte man mit der Report-Funktion auch die Einkaufsliste vernünftig anzeigen lassen.
und zu Punkt 2. das ist die Struktur vom IOBroker und das Menü generiert sich komplett daraus
Viele Grüße
@jwerlsdf du könntest in deinem anderen Script einfach bei Änderungen deine Liste füllen :
so in etwa :
//....
let myShoppingList = [];
on({id: 'javascript.0.TestEinkaufsliste' ,
change: 'any'}, (pMeldung) => {
if(pMeldung.state.val)
myShoppingList.push(pMeldung.state.val);
console.log(["Einkaufsliste :",myShoppingList]);
});
//.....
und mit der MyShoppingList kannst du dann machen was immer du machen willst
oder du legst dir gleich noch nen State dafür an anstatt ne lokale Variable und füllst diese
Eine gute Idee wäre wahrscheinlich auch in dem Menü ein zusätzlichen Eintrag zu machen um deine Einkaufsliste zu leeren oder einzelne Elemente zu löschen
Ich hab die Version vom Menü auf 0.0.17 geupdatet, diese sollte States die vom typ String sind supporten. Falls was nicht gehen sollte bitte ich um feedback ich hatte es nur rudimentär getestet.
Viele Grüße
@jwerlsdf was funktioniert genau nicht?
ich hatte jetzt noch nichts weiter am TelegramMenü geändert, weil ich dachte du brauchst es nicht.
Die aktuelle Version auf Git unterstütz noch keine States vom Typ String.
Wenn du das nutzen willst würde ich es die nächsten Tage einbauen.(ich hatte es mir nur temporär zum Testen eingebaut)
Viele Grüße
na meine idee für dich wäre ja gewesen du nutzt nur das menü als eingabe, könntest du ja ne separate telegram instanz und bot dazu verwenden und deine 6 scripte reagieren auf die 6 states wo die eingabe desn menüs hingeht
du nutzt quasi nen separaten bot der das menü für die eingabe nimmt. dort hättest du dann z.b. menü (einkaufen, schichtplan ,....)
vg
@nahasapee sorry die quali vom video ist unterirdisch hier noch mal bisschen bessere Auflösung :
https://1drv.ms/v/s!ApNXnkLEcciklX3Hx_KOOUqnl-Cl?e=PEeYM1
@ignis-draco hi, nette Idee mit der Einkaufsliste, man könnte mein Telegram-Menu zur Eingabe verwenden
man müsste sich bloß :
das menü findest du hier : https://github.com/Nahasapeemapetilon/MyTelegramMenu
allerdings muss ich dazu sagen, dass momentan noch keine string eingabe von der version von github unterstützt wird nur number , ich hatte mir die Erweiterung nur temporär eingebaut, falls du das verwenden möchte würde ich es noch mal testen und dann hochladen
Viele Grüße