Skip to content

Skripten / Logik

Hilfe zu JavaScript, Blockly, TypeScript, Node-RED, Scenes und text2command

16.6k Topics 213.7k Posts

NEWS

Subcategories


  • Hilfe für Skripterstellung mit JavaScript

    2k 49k
    2k Topics
    49k Posts
    Pedder007P
    @Schimi Danke, läuft nun auch bei mir :-)
  • Hilfe für Skripterstellung mit Blockly

    7k 79k
    7k Topics
    79k Posts
    Horst BöttcherH
    @crunchip Das ist mir durchaus bewusst, aber ich habe trotzdem ständig Probleme :-( Mit Adaptern, die nicht richtig funktionieren oder plötzlich rot oder orange angezeigt werden. Mit Lichtern, die sich nicht schalten lassen – und dann wiederum manchmal doch, oder zu Zeiten, zu denen sie eigentlich niemand einschaltet.
  • Hilfe für Skripterstellung mit Node-RED

    953 13k
    953 Topics
    13k Posts
    Marc BergM
    Es gibt in der Verson 1.3.0 einen neuen Node: iob-setObject (Stand 10.02.26 noch beta) Mit dem neuen Node kann man ioBroker-Objektdefinitionen (Metadaten) direkt schreiben und ändern. Hauptfunktionen: Instanz-Konfigurationen ändern - z.B. MQTT publish-Pattern, Intervalle, etc. Objekt-Eigenschaften aktualisieren - Namen, Rollen, Einheiten, Min/Max-Werte ändern es gibt zwei Modi: Merge-Modus : Ändert nur die angegebenen Eigenschaften, alle anderen bleiben erhalten Replace-Modus: Überschreibt das komplette Objekt Typischer Workflow: Objekt mit iob-getobject holen Mit Change-Node gewünschte Properties ändern Mit iob-setobject zurückschreiben
  • Blockly langsam und speichert oft nicht

    9
    0 Votes
    9 Posts
    338 Views
    HomoranH
    @djmarc75 geht doch um die Bearbeitung im Editor
  • Abfrage der Erreichbarkeit der Sensoren

    blockly
    25
    0 Votes
    25 Posts
    3k Views
    H
    @htrecksler ich habe das mal ein bisschen überarbeitet. Der createState war nicht korrekte und das Log hat Fehler geworfen. Das Objekt was angelegt wurde war nur Read Only. Hier die angepasste Version: //Das Script überprüft regelmässig die Datenpunkte auf Aktualisierung //Angabe des Datenpunkts= Datenpunkt der Überwacht werden soll //StateBezeichnung= Unter pfad_javascript.StateBezeichung wird ein State angelegt; True = Daten sind aktuell / False = Daten veraltet //Zeit in Sekunden = Zeit die vergangen sein darf seit der letzen Aktualisierung des Datenpunkts (0 = default Zeit wird genommen). schedule("*/3 * * * *" , function () { // Angabe des Datenpunkts;StateBezeichnung;Zeit in Sekunden var ueberwachung = ['mqtt.0.Wetterstation.Batterie;Wetterstation;440']; var default_zeit = 400; var pfad_userdata ='0_userdata.0.watchdog.'; // !Punkt nicht vergessen am Ende! //------------------------------------------------------------------ //Ab hier nichts mehr Ändern //------------------------------------------------------------------ var zeit= Math.floor(Date.now() / 1000); var differenz, lchange; var daten, tchange; ueberwachung.forEach(function(item, index, array) { // Array Splitten daten = item.split(";"); //Datenpunkt erstellen wenn nicht vorhanden createState(pfad_userdata + daten[1], { read: true, write: true, name: "Watchdog " + daten[1], type: "boolean", def: false } ) //Differenz Zeit default oder manuell? differenz = parseInt(daten[2]); if (differenz == 0) differenz=default_zeit; //Zeitstempel abfragen in Sekunden tchange=parseInt(getState(daten[0]).ts / 1000); //Vergleichen der Zeitstempel if ((zeit-tchange)>differenz) { setState(pfad_userdata + daten[1], false); //setState("telegram.0.communicate.response", daten[1] + ' - ' + "Info: Sensor nicht erreichbar"); //console.log(daten[1] + " ist älter als " + differenz + " Sekunden", 'warn'); } else { setState(pfad_userdata + daten[1], true); //console.log(daten[1] + " ist jünger als " + differenz + " Sekunden"); } }); });
  • Shuttercontrol Sonnenschutz funktioniert nicht (Homematic)

    5
    6
    0 Votes
    5 Posts
    489 Views
    E
    Ok, danke. Das scheint das Problem gelöst zu haben. Ich danke euch für eure Tipps.
  • Vorstellung meines Bewohnerstatus

    blockly javascript
    5
    1
    2 Votes
    5 Posts
    2k Views
    EisteeE
    @rtwl Ich verwende Bewegungsmelder. Und ja wir leben zu zweit mit Hund und ja der Bewegungsmelder im Schlafzimmer sieht auch wenn man sich im Bett bewegt. Aber ich habe den Bewegungsmelder halt so mit Bedingungen verknüpft das er nur das schlafen gehen anstößt (gotosleep) und damit Lichtscene dunkles zu Bett geh Licht. Das Schlafend (asleep) steuert dann Licht aus und kommt automatisch nach 10 Minuten oder durch einen Schalter am Bett mit dem man bei bedarf das Licht auch wieder an schalten kann. Der Bewegungsmelder Schaltet bei Dämmerung das Licht für eine Dauer an wenn der Status home gesetzt ist. Wenn gotosleep oder asleep gesetzt sind macht der Bewegungsmelder kein Licht an. Da steuert das gotosleep und asleep dann direkt das Licht. Bedingung zum schlafen gehen (gotosleep) bei mir: Uhrzeit 22:00-04:00Uhr und beide Harmony Hubs (Beamer / Fernsehr in verschiedenen Räumen) melden Aus. Getriggert durch Bewegungsmelder Schlafzimmer oder Bewegungsmelder Bad Im Bild die Bedingungen und ich stehe immer zuerst auf deshalb setzt mich der Bad Bewegungsmelder wieder wach.[image: 1659084363562-screenshot-2022-07-29-104455.png]
  • Zähle Datenpunkte innerhalb eines Verzeichnis

    3
    0 Votes
    3 Posts
    369 Views
    C
    @paul53 sagte in Zähle Datenpunkte innerhalb eines Verzeichnis: $('Verzeichnis-ID.*').length Danke schonmal. length gibt mir dann die Länge der Zeichen von der Verzeichnis-ID aus. Edit: Vergiss es. Hab das Dollar-Zeichen vergessen. Passt. Danke dir :)
  • RGB Lampe mit XY Wert füttern

    9
    0 Votes
    9 Posts
    245 Views
    mickymM
    @gluecksmann du könntest ja mal versuchen, ob die von @DJMarc75 erwähnten r,g,b Datenpunkte funktionieren oder bissi googeln. Hier mal Farben in dem von Dir gewünschten Format: https://www.enigmaticdevices.com/philips-hue-lights-popular-xy-color-values/ Außerdem kann man vielleicht in dem colormode, der auf xy steht, diesen auf rgb oder hsl umstellen.. EDIT: So wie ich verstanden habe, kann die HUE Bridge nur xy Color Werte, aber das sollte nach meinem Verständnis automatisch umrechnen, da der die entsprechende API zur Konvertierung eingebaut hat. So habe ich diesen Thread hier verstanden: https://forum.iobroker.net/topic/1510/iobroker-hue-mit-hue-bridge-2
  • Blockly warten mit Bedingung

    27
    1
    0 Votes
    27 Posts
    2k Views
    rtwlR
    @cainam sagte in Blockly warten mit Bedingung: Meine Idee war mal zB den Wert Stromverbrauch zu überwachen. Dh beim Runtergehen ist dieser auf >50W. sobald dieser wieder auf 0ist würde dann der Befehl auf 66% ausgelöst. doch schaff ich das nicht Ich zitiere mal deine Idee aus Beitrag #1. Selbe Idee hatte ich auch und konnte es so lösen. Keine Ahnung ob du es mittlerweile geschafft hast, aber vielleicht hilfts dennoch: [image: 1658868743136-523ec876-bf0c-45a3-9a15-c7a99266ff2b-image.png] Raff_Position bzw Raff_Power sind die jeweiligen Datenpunkte der Shellys. Sobald Position 0 angefahren wird, wird eine Minute lang (60 Wiederholungen) jede Sekunde (Pause 1000ms) geprüft ob der Stromverbrauch kleiner als 5W ist. Falls ja, wird auf Position 2 gefahren und die Schleife abgebrochen.
  • Shelly Bulbs gruppieren und RGBW per Alexa steuern

    10
    1
    0 Votes
    10 Posts
    605 Views
    da_WoodyD
    @reutli hehe, gerne doch! die farbtemperatur in weiß hab ich nicht geschafft. da muss ich noch text üben... ;) effekte konnte ich auch nicht schalten. wie gesagt, hufe in horizontallage für heute. wurde heute um 06:12 von einem blitzeinschlag ganz nahe geweckt... :dizzy_face:
  • IOBroker Anfänger-Problem Aquara Cube & Philips Hue

    4
    4
    0 Votes
    4 Posts
    209 Views
    HomoranH
    @planetcom sagte in IOBroker Anfänger-Problem Aquara Cube & Philips Hue: Der Trigger wird ausgelöst. du bist ja sogar schon im falls! also ist auch das korrekt
  • Rolläden zusammen fahren oder getrennt

    7
    0 Votes
    7 Posts
    598 Views
    D
    Okay, versuch ich es mal. Ich habe zuerst einen extra Datenpunkt unter den Objekten im user.data angelegt. Eine Zahl. [image: 1658756274059-objekt.png] Dieser Datenpunkt wird einfach durch den Schiebregler "Wohn-Esszimmer" mit einer Zahl zwischen 1-100 beschrieben. [image: 1658756408155-screen.png] So und dies kleine Blockly Script steuert jetzt bei einer Änderung dieses Datenpunktes die beiden Positionseinträge der Shellys mit dem Wert. Folge: die beiden Shellys lassen die Rolläden auf die Position fahren. [image: 1658756626710-position.png] Wenn ich jetzt mit den einzelnen Regler andere Werte für die Rolläden einstelle bleiben sie trotzdem unabhängig von einander. Erst wenn ich den gemeinsamen Regler wieder verstelle laufen sie wieder die gleiche Position an. Ich finde typische Fall von "wenn man weiß wie, ganz einfach" Kein Gemeckere wegen dem Design des Views, ist noch in Arbeit ;-)
  • GPIO Status Wemos d1 mini an iobroker senden

    193
    0 Votes
    193 Posts
    27k Views
    B
    @tt-tom Hat schon. #include <ESP8266WiFi.h> #include <ArduinoOTA.h> #include <PubSubClient.h> #include <AccelStepper.h> #include <Adafruit_NeoPixel.h> #ifndef STASSID #define STASSID "msg2" #define STAPSK "1629969423743097" #endif #define MotorStatus D2 // Steppermotor aktivieren/deaktivieren #define LEDpin D7 // Umgesteuerter GPIO für die NEO-Led #define NUMPIXELS 1 // Anzal der LEDs const char* ssid = STASSID; const char* password = STAPSK; char* mqtt_client_id = "Essig_Innen"; const char* mqtt_server = "192.168.49.38"; const int mqtt_port = 1886; const char* mqtt_user = "mqttuser"; const char* mqtt_password = "Beowolf503588"; const byte Pegelschalter = D6; // Pegelschalter für Essigvorrat const byte RelaisVentil = D5; // Relais für Wasserzufuhrventil // const long SchritteUmdrehung = 200; // Schritte des Schrittmotors für 360 Grad der Tür const unsigned int Essigdosis = 20000; int lebenszeichen_zaehler = 0; // Zähler um Lebenzeichen an MQTT Broker zusenden int lebenszeichen_interval = 10; // interval für MQTT Broker in sek int messung_interval = 10; // interval für Pegelmessung in sek long led_takt = 500; // Zeittakt (ms) für die LED ##takt## long led_zeit; // Letzter Durchlauf (ms) für die LED ##takt## long lebenszeichen_takt = lebenszeichen_interval * 1000; // Zeittakt (ms) ##takt## long lebenszeichen_zeit; // Letzter Durchlauf (ms) ##takt## long lebenszeichen_ein_aus = 0; // ##takt## long messung_takt = messung_interval *1000; // Zeittakt (ms) long messung_zeit; //Letzter Durchlauf (ms) WiFiClient espClient; PubSubClient mqttClient(espClient); AccelStepper stepper(1, D3, D4); //Pins für den Steppermotor STEP , DIR Adafruit_NeoPixel pixels = Adafruit_NeoPixel(2, LEDpin, NEO_GRB + NEO_KHZ800); void setup() { pinMode(LEDpin, OUTPUT); // NEO-LED pinMode(Pegelschalter, INPUT_PULLUP); // Pegelschalter für Essigtank pinMode(RelaisVentil, OUTPUT); // Relais für Wasserzufuhrventil pinMode(MotorStatus, OUTPUT); // Enable Motor 1 pinMode(LED_BUILTIN, OUTPUT); // Board-LED nutzen stepper.setMaxSpeed(1000); stepper.setAcceleration(1500); digitalWrite(MotorStatus, HIGH); //Motor deaktiviert Serial.begin(9600); // while(!Serial){ // ; // wartet bis die serielle Schnittstelle eine Verbindung hergestellt hat. Wird für natives USB benötigt // } // Per WLAN mit dem Netzwerk verbinden Serial.print("Verbinden mit "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } /////////////////////////////////////////// // Anfang Update über Wlan /////////////////////////////////////////// ArduinoOTA.onStart([]() { String type; if (ArduinoOTA.getCommand() == U_FLASH) { type = "sketch"; } else { // U_FS type = "filesystem"; } // NOTE: if updating FS this would be the place to unmount FS using FS.end() Serial.println("Start updating " + type); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); } else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); } else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); } else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); } else if (error == OTA_END_ERROR) { Serial.println("End Failed"); } }); ArduinoOTA.begin(); /////////////////////////////////////////// // Ende Update über Wlan /////////////////////////////////////////// // Die IP vom Webserver auf dem seriellen Monitor ausgeben Serial.println(""); Serial.println("WLAN verbunden."); Serial.println("IP Adresse: "); Serial.println(WiFi.localIP()); // MQTT Brocker // Mit ioBroker Mqtt verbinden mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.setCallback(callback); // NEO_Pixel Start pixels.begin(); // This initializes the NeoPixel library. lebenszeichen_zeit = millis(); // ##takt## led_zeit = millis(); // ##takt## messung_zeit = millis(); Serial.println("Programmanfang"); } //ende Setup ////////////////////////////////////////////////////////////////////////////////// void loop() { ArduinoOTA.handle(); ArduinoOTA.setHostname("Essig_Innen"); Pegelstand_lesen(); Essigdosierer_deaktivieren(); lebenszeichen(); stepper.run(); // MQTT Broker mqttClient.loop(); if (!mqttClient.connected()) { reconnectToMQTT(); } } //ende loop ///////////////////////////////////////////////////////////////////////////////// void Pegelstand_lesen() { long current_time = millis(); if (messung_zeit <= current_time) { if (digitalRead(Pegelschalter)) { mqttClient.publish("HH_Frischwasser/Innen/Essigpegel", "1"); } else { mqttClient.publish("HH_Frischwasser/Innen/Essigpegel", "0"); } while (messung_zeit <= current_time) messung_zeit += messung_takt; } } // MQTT Funktion // ************* void reconnectToMQTT() { if (mqttClient.connect(mqtt_client_id , mqtt_user, mqtt_password)) { Serial.println("Per MQTT mit ioBroker verbunden"); mqttClient.publish("HH_Frischwasser/Innen/alive", "0"); mqttClient.subscribe("HH_Frischwasser/Innen/Frischwasserventil"); mqttClient.subscribe("HH_Frischwasser/Innen/Essigdosierer"); } else { Serial.print("mqtt-Verbindung fehlgeschlagen "); Serial.print(mqttClient.state()); Serial.println(" versuchen es in 5 Sekunden erneut"); // Wait 5 seconds before retrying delay(5000); } } // MQTT Callback void callback(char* topic, byte* payload, unsigned int length) { payload[length] = '\0'; String strTopic = String(topic); String strPayload = String((char * ) payload); Serial.print("Nachricht angekommen ["); Serial.print(strTopic); Serial.print("----"); Serial.print(strPayload); Serial.print("] "); Serial.println(); if (strTopic == "HH_Frischwasser/Innen/Frischwasserventil") { // Pumpe Start if (strPayload == "false") { Serial.println("Frischwasserventil geöffnet über IoBroker"); digitalWrite(RelaisVentil, HIGH); pixels.setPixelColor(0, pixels.Color(0, 0, 255)); //LED Farbe blau pixels.show(); } // Pumpe Stop if (strPayload == "true") { Serial.println("Frischwasserventil geschlossen über IoBroker"); digitalWrite(RelaisVentil, LOW); pixels.setPixelColor(0, pixels.Color(0, 255, 0)); //LED Farbe grün pixels.show(); } } if (strTopic == "HH_Frischwasser/Innen/Essigdosierer") { // Essigdosierer Start if (strPayload == "true") { Serial.println("Start Essigdosierer über IoBroker"); digitalWrite(MotorStatus, LOW); //Motor aktiviert stepper.move(Essigdosis); pixels.setPixelColor(1, pixels.Color(255, 127, 0)); //LED Farbe gelb pixels.show(); } } } void Essigdosierer_deaktivieren() { // Essigdosierer Stopp if (stepper.currentPosition() == Essigdosis) { Serial.println(stepper.currentPosition()); mqttClient.publish("HH_Frischwasser/Innen/Essigdosierer", "false"); Serial.println("Essigdosierer gestoppt"); pixels.setPixelColor(1, pixels.Color(0, 255, 0)); //LED Farbe grün pixels.show(); stopp(); } } void stopp() { stepper.setCurrentPosition(0); stepper.stop(); digitalWrite(MotorStatus, HIGH); //Motor deaktiviert } void lebenszeichen() { // ##takt## --> long current_time = millis(); // LED auf dem Board blinken lassen if (led_zeit <= current_time) { if (digitalRead(LED_BUILTIN) == HIGH) digitalWrite(LED_BUILTIN, LOW); else digitalWrite(LED_BUILTIN, HIGH); while (led_zeit <= current_time) led_zeit += led_takt; } if (lebenszeichen_zeit <= current_time) { if (lebenszeichen_ein_aus == 0) { mqttClient.publish("HH_Frischwasser/Innen/alive", "1"); lebenszeichen_ein_aus = 1; } else { mqttClient.publish("HH_Frischwasser/Innen/alive", "0"); lebenszeichen_ein_aus = 0; } while (lebenszeichen_zeit <= current_time) lebenszeichen_zeit += lebenszeichen_takt; } // ##takt## <-- }
  • Wled per Blocklyscript für Garagentorzustände steuern

    20
    2
    0 Votes
    20 Posts
    971 Views
    paul53P
    @spidermike sagte: wenn ich mit 2 Timeout arbeiten will [image: 1658684546909-bild_2022-07-24_194226382.png]
  • Umlaut im Javascript Namen - wie ändern?

    13
    1
    0 Votes
    13 Posts
    326 Views
    hg6806H
    So, habe es hinbekommen. Nach der Spiegelung habe ich es dort gelöscht und noch einmal in den Objekten. Jetzt geht wieder alles . Danke euch allen!
  • [gelöst] Webseite anlassbezogen auslesen

    5
    0 Votes
    5 Posts
    344 Views
    T
    @paul53 Spitze! Ich habe fürs nachbauen sicher länger gebraucht wie du fürs erstellen. Wenn mans dann sieht, klingt alles ganz logisch. Selbst draufgekommen wäre ich niemals. Besten Dank für die schnelle Hilfe. Schöne Grüße Tom
  • mit Verzögerung, löschen falls läuft deaktivieren

    9
    1
    0 Votes
    9 Posts
    307 Views
    paul53P
    @venturex sagte: Wo ist mein Fehler? Selektiere Wert anstelle von Objekt ID. Was hast Du gegen die Vereinfachung mit nur einem Timeout und der ODER-Verknüpfung der Uhrzeiten?
  • Datenpunkt auf "keine Änderung" überwachen

    3
    0 Votes
    3 Posts
    116 Views
    paul53P
    @androiddev sagte: Das Pythonscript sendet über Simple-Api jede Minute eine '0' an einen Datenpunkt. Das kann man mittels var timer = null; on({id: 'meineID'}, function() { // triggert bei jeder Zeitstempelaktualisierung clearTimeout(timer); timer = setTimeout(function() { // Aktion, wenn Trigger ausbleibt }, 150000); // 2,5 Minuten }); überwachen. Mehr muss nicht gemacht werden.
  • Idee Ausführung Skripte analog einer Siemens-SPS

    12
    3
    0 Votes
    12 Posts
    859 Views
    paul53P
    @flyer99 sagte: Der gibt dem JS Controller bescheid zum Starten des Skripts ? ... zum Auslösen des Ereignisses (Trigger, Ablauf eines Timers, ...) innerhalb des Skriptes.
  • Zahlvariable erhöhen

    15
    1
    0 Votes
    15 Posts
    992 Views
    L
    @homoran richtig deshalb schon bei mir geändert
  • Wort in Wert von Objekt suchen

    3
    1
    0 Votes
    3 Posts
    241 Views
    rtwlR
    @ionar kannst du 10 Tage später bestätigen, dass der Wert (Symbol) 1 reicht für die Beschattung? Ist es bei "2 - teils bewölkt" nicht auch zu sonnig wo eine Beschattung Sinn machen würde?
  • Thermostat steuern in Iqontrol

    3
    0 Votes
    3 Posts
    260 Views
    E
    @paul53 Wegen dem 2-Punkt-Regler muss ich schauen, wenn ich von Dienstreise zurück bin. Soll-/Istwert zur Steuerung der Heizung, dass diese wirklich nur dann heizt, wenn bei den kritischen Stellen im Haus Frostgefahr aufkommt. Ist ein Altbau, den wir übernommen und zu 90% saniert haben. Leider ist die Heizung noch nicht ganz sauber, so dass wir im sanierten Teil Fussbodenheizung haben, im HWR, da wo auch die Frostgefahr am grössten ist, hängt aber ein Wandradiator, im gleichen Kreislauf mit der FBH. Die FBH hat zwar Raumregler, aber dennoch gibt das jedes Jahr unnötige Heizkosten, nur um auf Verdacht den HWR "schön warm" zu halten.

254

Online

32.7k

Users

82.4k

Topics

1.3m

Posts