Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Praktische Anwendungen (Showcase)
    4. Projekt: Shelly plus1 AddOn Temperaturen mit JS auslesen

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Projekt: Shelly plus1 AddOn Temperaturen mit JS auslesen

    This topic has been deleted. Only users with topic management privileges can see it.
    • fuzzy1955
      fuzzy1955 last edited by fuzzy1955

      In meiner kurzen IoBroker-„Laufbahn“ seit Oktober 2024 habe ich eifrigst an dem wundervollen OpenSource-Tool einige praktische Anwendungsbeispiele erprobt. Eines davon ist das automatisierte Auslesen von 3 Temperatursensoren und die 10-minütige Speicherung der Werte in einer MySQL-Datenbank. Das Projekt läuft seit 3 Wochen im Testbetrieb und wird ein Teil meiner geplanten Heizungssteuerung mit IoBroker. Darin befindet sich auch ein Luftsolarkollektor der deutschen Firma Grammer Solar, den ich seit 2007 nicht mehr missen möchte. In diesem Projekt wurde bewusst auf den Shelly-Adapter verzichtet, weil ich als Programmier-Freak gerne die Freiheiten in JavaScript genieße.

      Hardware:
      • RaspBerry Pi 4 mit 4 GB RAM im Hutschienengehäuse; Linux Debian an USB2-Stick mit 256 GB
      • Shelly Plus1 mit AddOn
      • 3 x Temperatursensoren DS18B20

      Adapter:
      • Javascript

      Ablauf:
      • An den Shelly Plus1 mit AddOn werden die Temperatursensoren angeschlossen und anschließend in der eingestellten IP-Adresse im Internet-Browser unter dem Punkt „Add-on“ konfiguriert.

      Shelly Pro 1 AddOn Temperatursensoren.jpg

      In dieser Web-Oberfläche kann man auch sofort die Temperaturen ablesen.

      • Im IoBroker wechselt man zu „Objekte“ und legt folgende Datenpunkte zuerst unter „javascript.0.scriptEnabled.Eigene_Datenpunkte“ an:

      javascript.0.scriptEnabled.Eigene_Datenpunkte.ShellyPlus1_01.Aussentemperatur
      javascript.0.scriptEnabled.Eigene_Datenpunkte.ShellyPlus1_01. Innentemperatur
      javascript.0.scriptEnabled.Eigene_Datenpunkte.ShellyPlus1_01. Luftsolartemperatur

      • Dann legt man die gleichen DP unter „alias.0.Klimatisierung (als Beispiel)“ an und referenziert sie auf die DP unter „javascript.0.scriptEnabled.Eigene_Datenpunkte“ und aktiviert – wahlweise - die automatische SQL-Speicherung (Zahnrad rechts im Datenpunkt). Die DP sind aber auch ohne SQL-Speicherung direkt in Skripts verwendbar:

      alias.0.Klimatisierung.ShellyPlus1_01.Aussentemperatur
      alias.0.Klimatisierung.ShellyPlus1_01.Innentemperatur
      alias.0.Klimatisierung.ShellyPlus1_01.Luftsolartemperatur

      IoB_Objekte_Alias.jpg

      Dazu habe ich von mehreren Forums_Usern den wertvollen Tipp gelesen, dass eine eigene DP-Struktur unter alias.0.xxx... sehr hilfreich in Blick auf die Übersichtlichkeit ist. Meine Struktur schaut teils so aus:

      IoB_Objektstruktur.jpg

      • Im IoB wechselt man dann zu „Skripte – neues Skript (+) – JavaScript“ und legt folgendes Skript an:

      var data;
      
      schedule("*/10 * * * * *", async () => {
        httpGet('http://192.168.xxx.xxx/rpc/temperature.getstatus?id=100', { 
              timeout: 2000, responseType: 'text' }, async (err, response) => {
              data = (() => { 
              try { 
                  setState('alias.0.Klimatisierung.ShellyPlus1_01.Aussentemperatur', getAttr(JSON.parse(response.data), 'tC'), true);
                  }
              catch (e) { 
                  return {}; 
                  }
              })();
        });
      
        httpGet('http://192.168. xxx.xxx /rpc/temperature.getstatus?id=101', { 
              timeout: 2000, responseType: 'text' }, async (err, response) => {
              data = (() => { 
              try { 
                  setState('alias.0.Klimatisierung.ShellyPlus1_01.Innentemperatur', getAttr(JSON.parse(response.data), 'tC'), true);
                  }
              catch (e) { 
                  return {}; 
                  }
              })();
        });
      
        httpGet('http://192.168. xxx.xxx /rpc/temperature.getstatus?id=102', { 
              timeout: 2000, responseType: 'text' }, async (err, response) => {
              data = (() => { 
              try { 
                  setState('alias.0.Klimatisierung.ShellyPlus1_01.Luftsolartemperatur', getAttr(JSON.parse(response.data), 'tC'), true);
                  }
              catch (e) { 
                  return {}; 
                  }
              })();
        });
      });
      
      

      Dieses Skript aktiviert man mit Klick auf den roten Pfeil und damit läuft es dann alle 10 Minuten. Die Zeit kann jeder beliebig einstellen. Die Werte werden – wahlweise - in die MySQL-Datenbanktabelle „ts_number“ geschrieben. Die MySQL-Tabellen habe ich selbst angelegt – wiederum aufgrund von Internet-Recherchen (ich bin halt ein Datenbank-Fan):

      CREATE TABLE sources(  
      	id INTEGER NOT NULL AUTO_INCREMENT,
      	name VARCHAR(255) NOT NULL,  
      PRIMARY KEY (id)) ENGINE = InnoDB;
      
      CREATE UNIQUE INDEX IX_sources01 ON sources(name);
      
      CREATE TABLE datapoints(  
      	id INTEGER NOT NULL AUTO_INCREMENT,  
      	name TEXT NOT NULL,
      	type INTEGER NOT NULL,  
      PRIMARY KEY (id)) ENGINE = InnoDB;
      
      CREATE UNIQUE INDEX IX_datapoints01 ON datapoints(name);
      
      CREATE TABLE ts_number(  
      	id INTEGER NOT NULL AUTO_INCREMENT,  
      	ts BIGINT NOT NULL,
      	val REAL,
      	ack BOOLEAN,
      	q INTEGER NULL,
      	_from INTEGER NOT NULL,
      PRIMARY KEY (id,ts)) ENGINE = InnoDB;
      
      CREATE INDEX IX_ts_number01 ON ts_number(ts);
      CREATE INDEX IX_ts_number02 ON ts_number(id);
      CREATE INDEX IX_ts_number03 ON ts_number(id);
      

      Die Abfrage für die Visualisierung (auch von Zeitreihen) lautet:

      CREATE OR REPLACE VIEW vw_temperaturen AS 
      SELECT a.id, from_unixtime(SUBSTRING(a.ts, 1, 10)) AS tsDate, a.val AS GradC, b.name, c.name as sourcename
      FROM ts_number a LEFT OUTER JOIN
      	datapoints b ON a.id = b.id LEFT OUTER JOIN
      	sources c ON a._from = c.id
      WHERE a.id in (xx, yy,zz) AND a.q = 0; //siehe Tabelle datapoints 
      
      

      Diese Abfrage lässt sich etwa bei den IoB-Diagrammen einsetzen:

      IoB_Diagramm01.jpg

      Nun – das war es. Ich freue mich, wenn das Beispiel für manche von euch verwendbar ist.

      Beste Grüße aus dem Mühlviertel, hf

      1 Reply Last reply Reply Quote 0
      • First post
        Last post

      Support us

      ioBroker
      Community Adapters
      Donate

      727
      Online

      31.7k
      Users

      79.7k
      Topics

      1.3m
      Posts

      1
      1
      127
      Loading More Posts
      • Oldest to Newest
      • Newest to Oldest
      • Most Votes
      Reply
      • Reply as topic
      Log in to reply
      Community
      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
      The ioBroker Community 2014-2023
      logo