IKEA TRÅDFRI Signalverstärker

Signalverstärker + DeConz (Conbee II von Dresden Elektronik)

Sollte die Reichweite der ZigBee Geräte, welche man an einem ConBee II von Dresden Elektronik nicht ausreicht, ist die erste Alternative natürlich ein USB Pigtail um den USB-Stik von dem Computer / Elektronik weg zu bekommen. Fast genauso teuer ist aber auch der Signalverstärker von Ikea. Mit gerademal 10€ erhält man ein USB Ladegerät und ein Aufsteck-Signalverstärker.

DeConz selbst kennt den Verstärker bereits – das UI hat dafür aber noch keine „Kategorie“. Deswegen wirkt ist die Einrichtung etwas merkwürdig. Zum Einrichten selbst brauch man aber einen passenden Gegenstand um den Signalverstärker resetten zu können.

Vorgehensweise:

  • Repeater in die Steckdose stecken (Anschalten)
  • im Phoscon unter Geräte –> Lichter –> „Neue Lichter verbinden“ anklicken.
  • Repeater resetten wie links gezeigt. Für den Reset muss man den Taster im Inneren ca. 5 Sekunden drücken und dann los lassen. Anschließend blinkt die LED.

Wenige Sekunden danach sollte der Repeater unter „Verbundene Lichter“ erscheinen.

Das ZigBee Netzwerk organisiert sich selbst, womit die Einrichtung damit erledigt ist. Im Deconz selbst kann man nun noch den VNC Mode aktivieren und sich das Netzwerk anschauen.

Ich muss jetzt noch die passende Steckdose finden, damit mein Multisensor 5 in der Garage funken kann 😊.

Veröffentlicht unter Heimautomatisierung, ZigBee | Verschlagwortet mit , , , , , , | Schreib einen Kommentar

YouTube Werbung blocken / DNS

Etwas Werbung ist ja ok, aber YouTube übertreibt es in letzter Zeit immer mehr. Also Grund genug Gegenmaßnahmen zu ergreifen 😈 

Bildergebnis für youtube ad blocker

In meinem Netzwerk läuft sowieso schon der pi-hole und der blockt auch schon gut was weg. In Apps und Webseiten vermisst man jedenfalls keine Werbung. Und neben schnelleren Ladezeiten fängt man sich eher weniger oft irgendwas ein 😉

Ich habe hier mal 3 Listen von GitHub Projekten die man einbinden kann und damit einen ganz guten Mix hat. Stand heute werden diese auch gepflegt 🙂

Wer noch weitere gute Projekte / Listen kennt –> Bitte in die Kommentare

Veröffentlicht unter Nützliches | Verschlagwortet mit , , , , , , | Schreib einen Kommentar

InfluxDB Fehler 500 und Timeout

Für meine Diagramme und so nutze ich eine Influx DB + Grafana. Die Daten hatte ich mal über den influxDb History Adapter von ioBroker gemacht, aber da gab´s immer mal Fehler. Also sende ich die Daten jetzt selbst. So wie ich sie brauche und nur die Daten die ich brauche. In den wenigen Tagen wo ich den ioBroker Adapter laufen lies sind auch über 1GB Daten angefallen.. das bedeutet allein schon knapp 50GB pro Jahr – das wäre Wahnsinn.

Jetzt hatte ich aber das Problem, dass die Influx wohl überlastet ist. Es gab immer wieder Error 500 oder Timeout Probleme. Also dachte ich mir, ich reduziere die Anzahl der Requests auf die DB. Bisher habe ich jeden Wert einzeln gesendet und auch gedrosselt gab es Probleme.
Deswegen jetzt ein Subflow: Jetzt fasse ich eine Messeinheit als ein Objekt zusammen und sende das – 1x pro Minute.

Bisher: Also der Messwert kommt, wird per Funktion dem Feld zugeordnet und eventuell konvertiert und dann über eine Drosselung zur InfluxDB geschickt.

Jetzt neu gibt es ein Subflow der die Werte speichert und wenn welche vorhanden sind schickt er diese gebündelt ab. Aus einem Objekt mit einem Messwert wird also ein Objekt mit beliebig vielen Objekten. Das Measurement und die Haltezeit sind einstellbar.

Zum Ablauf: Die Werte kommen rein, werden in einem Javascript Objekt gespeichert. Jede Sekunde wird per Inject geprüft wie lange die letzte Ausgabe her ist und in einer Flow-Variable gespeichert. 300ms später prüft der Switch ob die Differenz größer ist als in den Eigenschaften definiert und wenn ja werden die Werte ausgegeben. Dabei wird auch das Objekt zurück gesetzt. Sprich geleert. Für das Senden hätte man auch das Gate aus dem letzten Beitrag nutzen können 🙂

Hier der Node Red Code für den Subflow:

[{"id":"b1ba376d.4bdd98","type":"subflow","name":"Payload Merge","info":"# Eingang\nmsg.payload muss ein Objekt sein. Alle Felder werden gespeichert und nach der definierten Zeit gesandt. \n\nKommt in der Zeit ein Messwert 2x wird der alte überschrieben!\n\n# Ausgang\nWenn werte eingelaufen sind kommt nach der definierten Zeit ein payload Objekt mit allen Feldern.\n\n# Reset\nwenn das Topic reset lautet wird alles zurück gesetzt - zum testen eher gedacht.","category":"","in":[{"x":40,"y":100,"wires":[{"id":"5dc702f5.f3a23c"}]}],"out":[{"x":880,"y":340,"wires":[{"id":"2014191d.a97366","port":0}]}],"env":[{"name":"SendInterval_in_sek","type":"num","value":"60"},{"name":"measurement","type":"str","value":""}],"color":"#DDAA99","inputLabels":["Messwerte"],"outputLabels":["zusammengefasstes Messwerte Objekt"],"status":{"x":360,"y":180,"wires":[{"id":"5dc702f5.f3a23c","port":1}]}},{"id":"c328ed2e.4af27","type":"function","z":"b1ba376d.4bdd98","name":"Werte speichern","func":"var data = flow.get('data') || \"{}\";\ndata = JSON.parse(data);\n\nvar payload = msg.payload;\n\nif (!(typeof payload === 'object' && payload !== null)){\n    return msg;\n}\n\nvar now =  Math.round((new Date()).getTime() / 1000);\n\nfor(var key in payload){\n   data[key]  = payload[key];\n}\n\n// speichern\nflow.set('data', JSON.stringify(data));\n\nreturn msg;","outputs":1,"noerr":0,"x":400,"y":120,"wires":[[]]},{"id":"99f17cad.7e5c8","type":"inject","z":"b1ba376d.4bdd98","name":"","topic":"","payload":"","payloadType":"date","repeat":"1","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":260,"wires":[["3badf961.3ca726","f556411c.2ce3a"]]},{"id":"2014191d.a97366","type":"function","z":"b1ba376d.4bdd98","name":"werte ausgeben","func":"var data = flow.get('data') || \"{}\";\ndata = JSON.parse(data);\n\n\nvar now =  Math.round((new Date()).getTime() / 1000);\n\nvar anzahl = 0;\nfor(var key2 in data){\n   anzahl++;\n}\n\n\n// speichern\nflow.set('data', \"{}\"); // leeren\nflow.set('lastUpd', now);\n\nmsg.measurement = env.get('measurement')||\"\";\nmsg.payload = data;\n\nif (anzahl == 0) return;\n\nreturn msg;","outputs":1,"noerr":0,"x":700,"y":340,"wires":[[]]},{"id":"5dc702f5.f3a23c","type":"switch","z":"b1ba376d.4bdd98","name":"","property":"topic","propertyType":"msg","rules":[{"t":"eq","v":"reset","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":170,"y":100,"wires":[["3b41e132.44415e"],["c328ed2e.4af27"]]},{"id":"3b41e132.44415e","type":"function","z":"b1ba376d.4bdd98","name":"reset","func":"\n\n// speichern\nflow.set('data', \"{}\");\nflow.set('lastUpd', 0);\nnode.warn(\"RESET\");\n\nreturn msg;","outputs":1,"noerr":0,"x":370,"y":60,"wires":[[]]},{"id":"f6973c1a.70a6","type":"switch","z":"b1ba376d.4bdd98","name":"","property":"SendDiff","propertyType":"flow","rules":[{"t":"gt","v":"SendInterval_in_sek","vt":"env"}],"checkall":"true","repair":false,"outputs":1,"x":550,"y":340,"wires":[["2014191d.a97366"]]},{"id":"3badf961.3ca726","type":"function","z":"b1ba376d.4bdd98","name":"berechnet SendInterval_in_sek","func":"var lastUpd = parseInt( flow.get('lastUpd') || 0);\nvar now =  Math.round((new Date()).getTime() / 1000);\n\nvar SendInterval_in_sek = parseInt(env.get('SendInterval_in_sek') || 30);\n\nvar diff  = now - lastUpd;\n//node.warn(\"Diff: \"+ diff);\nflow.set('SendDiff', diff);\n\nreturn msg;","outputs":1,"noerr":0,"x":430,"y":260,"wires":[[]]},{"id":"f556411c.2ce3a","type":"delay","z":"b1ba376d.4bdd98","name":"","pauseType":"delay","timeout":"300","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":360,"y":340,"wires":[["f6973c1a.70a6"]]}]

Die Fehler sind nicht ganz weg – aber schon weniger. Man könnte nun noch die payloads die da kommen in einen Batch zusammen fügen 🙂 – das später.

Veröffentlicht unter Javascript, Node Red | Verschlagwortet mit , , , , , | Schreib einen Kommentar

Externe Sensoren einbinden in Homematic / HomeKit

Hat man Sensoren anderer Hersteller als Homematic möchte man diese vielleicht eben auch a) zur Steuerung nutzen oder b) diese „sehen“ über HomeKit zum Beispiel.

Ich verwende von Xiaomi den Temperatur- und Feuchtigkeitssensor. Der Nebenbei auch noch den Luftdruck misst. Der Sensor ist gefühlt nur 3×3 cm groß 🙂 also super klein. Funken kann der Sensor mittels ZigBee. Und so wird das System aussehen:

Der Sensor wird über den ConBee II im Daemon DECONZ angemeldet. DECONZ bietet hier eine API an womit man den abfragen kann. DECONZ läuft bei mir als Docker-Container. Gleichzeitig läuft auf der CCU3 der CUx-Daemon der virtuelle Geräte erstellen kann ( ja der könnte auch zigbee 😉 )
Kernstück ist dann Node Red – was die ganzen Dienste verknüpft. Es holt sich die Daten von Deconz und schaufelt sie in die CCU3, in die InfluxDB und aus der CCU3 gelangen die Geräte ins HomeKit

Vorbereitungen

  1. Über den CUxD legen wir ein Thermostat an
  2. in der CCU3 muss das CUxD-Gerät konfiguriert und einem Raum zugewiesen werden.
  3. Der Sensor muss im DECONZ angelernt werden.

Anlegen im CUxD

Dazu in der CCU3: Einstellung >> Gerätemanager >> CUx-Daemon auswählen
Im CUx-Daemon dann im Menü oben „Geräte“ auswählen und wie folgt einrichten:

Konfig in der CCU3

In der CCU3 erscheint das Gerät nun im Posteingang, kann einem Raum/Gewerke zugeordnet werden und mit Fertig in die Geräteliste übernommen werden.

hier sind nun einmal der Mode auf „Temp+HUM“ zu setzen und „USE_HMDATAPT“ ist zu deaktivieren.

Anlernen in der Phoscon App / DECONZ

Dazu einfach auf Einstellungen >> Sensoren gehen und „Neuen Sensor verbinden“ anklicken. Am Sensor selbst musste ich die Taste nur einmal kurz betätigen. Der Sensor blinkte blau und zack waren beide verbunden.

Im Node RED

Für den Zugriff auf DECONZ benötigen wir das Modul: node-red-contrib-deconz. Und das Modul node-red-contrib-ccu.

Hier wird nun der Wert vom Sensor abgefragt, kurz umgewandelt (division durch 100) und dann a) der CCU3 gemeldet (dazu gleich mehr) und in meinem Fall sende ich das noch an die Influx DB.

Um den Wert in der CCU3 ist es wichtig das Gerät wie oben beschrieben zu konfigurieren und dann die SET_HUMIDITY bzw. SET_TEMPERATURE zu setzen und nicht HUMIDITY oder TEMPERATURE direkt!

Anzeigen im HomeKit

Das ist wohl der einfachste Teil. Mithilfe des Node Red Paketes redmatic-homekit muss man nur, wie in der Anleitung gut beschrieben, eine Home Bridge in einen Flow ziehen und schon werden alle CCU3 Geräte veröffentlicht – vollautomatisch. 🙂

Alternativ kann man das auch händig machen. Die DECONZ Adapter haben alle 2 Ausgänge. Der erste immer für das Datenobjekt bzw. den State (je nach Einstellung) und der 2. ist der Service Ausgang für ein Universalgerät im HomeKit. siehe https://github.com/rdmtc/RedMatic/wiki/Homekit#universal-accessory

Node Red Flow

[{"id":"f166fe9f.4bcde","type":"deconz-input","z":"dde2b0e6.aa168","name":"Bad Feuchte","server":"81052cf.8204ed","device":"00:15:8d:00:04:65:9e:1a-01-0405","device_name":"Multisensor 3 Bad : ZHAHumidity","state":"humidity","output":"always","outputAtStartup":true,"x":110,"y":440,"wires":[["5d167aa.1a49e84","2027fc31.7aab34"],[]]},{"id":"2027fc31.7aab34","type":"function","z":"dde2b0e6.aa168","name":"/ 100","func":"msg.payload = ( msg.payload / 100.0 )\nreturn msg;","outputs":1,"noerr":0,"x":330,"y":680,"wires":[["368e868c.72f33a"]]},{"id":"5d167aa.1a49e84","type":"function","z":"dde2b0e6.aa168","name":"/ 100","func":"msg.payload = {Bad_Feuchte: ( msg.payload / 100.0 )}\nreturn msg;","outputs":1,"noerr":0,"x":330,"y":420,"wires":[["391f3cc9.1cf6a4"]]},{"id":"85bc5941.0fe3e8","type":"function","z":"dde2b0e6.aa168","name":"/ 100","func":"msg.payload = ( msg.payload / 100.0 )\nreturn msg;","outputs":1,"noerr":0,"x":330,"y":740,"wires":[["6bba9e24.dd6f"]]},{"id":"617ed7c2.c5d398","type":"function","z":"dde2b0e6.aa168","name":"/ 100","func":"msg.payload = {BadTemperatur: ( msg.payload  / 100.0 )}\nreturn msg;","outputs":1,"noerr":0,"x":330,"y":500,"wires":[["391f3cc9.1cf6a4"]]},{"id":"18e0e1f9.2b591e","type":"deconz-input","z":"dde2b0e6.aa168","name":"Bad Temp","server":"81052cf.8204ed","device":"00:15:8d:00:04:65:9e:1a-01-0402","device_name":"Multisensor 3 Bad : ZHATemperature","state":"temperature","output":"always","outputAtStartup":true,"x":110,"y":500,"wires":[["617ed7c2.c5d398","85bc5941.0fe3e8"],[]]},{"id":"6bba9e24.dd6f","type":"ccu-set-value","z":"dde2b0e6.aa168","name":"set temp","iface":"CUxD","ccuConfig":"c14af3ca.fbc75","rooms":"","roomsRx":"str","functions":"","functionsRx":"str","device":"CUX9002003","deviceRx":"str","deviceName":"","deviceNameRx":"str","deviceType":"","deviceTypeRx":"str","channel":"CUX9002003:1","channelRx":"str","channelName":"","channelNameRx":"str","channelType":"","channelTypeRx":"str","channelIndex":"","channelIndexRx":"str","datapoint":"SET_TEMPERATURE","datapointRx":"str","force":false,"x":580,"y":740,"wires":[]},{"id":"368e868c.72f33a","type":"ccu-set-value","z":"dde2b0e6.aa168","name":"set feuchte","iface":"CUxD","ccuConfig":"c14af3ca.fbc75","rooms":"","roomsRx":"str","functions":"","functionsRx":"str","device":"CUX9002003","deviceRx":"str","deviceName":"","deviceNameRx":"str","deviceType":"","deviceTypeRx":"str","channel":"CUX9002003:1","channelRx":"str","channelName":"","channelNameRx":"str","channelType":"","channelTypeRx":"str","channelIndex":"","channelIndexRx":"str","datapoint":"SET_HUMIDITY","datapointRx":"str","force":false,"x":570,"y":680,"wires":[]},{"id":"391f3cc9.1cf6a4","type":"change","z":"dde2b0e6.aa168","name":"Klima_Innen","rules":[{"t":"set","p":"measurement","pt":"msg","to":"Klima_Innen","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":590,"y":440,"wires":[["444445b0.f3c80c"]]},{"id":"a5473156.07d27","type":"influxdb out","z":"dde2b0e6.aa168","influxdb":"542a42d0.731ccc","name":"Insert Influx Hausdaten","measurement":"","precision":"","retentionPolicy":"","x":1150,"y":440,"wires":[]},{"id":"444445b0.f3c80c","type":"delay","z":"dde2b0e6.aa168","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"2","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":860,"y":440,"wires":[["a5473156.07d27"]]},{"id":"81052cf.8204ed","type":"deconz-server","z":"","name":"Phoscon-GW","ip":"192.168.103.2","port":"8098","apikey":"AB6C93F0DF","ws_port":"8099","secure":false,"polling":"15"},{"id":"c14af3ca.fbc75","type":"ccu-connection","z":"","name":"CCU3","host":"192.168.103.3","regaEnabled":true,"bcrfEnabled":true,"iprfEnabled":true,"virtEnabled":true,"bcwiEnabled":false,"cuxdEnabled":true,"regaPoll":true,"regaInterval":"30","rpcPingTimeout":"60","rpcInitAddress":"192.168.103.2","rpcServerHost":"192.168.103.2","rpcBinPort":"2047","rpcXmlPort":"2048","queueTimeout":"5000","queuePause":"250","contextStore":""},{"id":"542a42d0.731ccc","type":"influxdb","z":"","hostname":"192.168.103.2","port":"8086","protocol":"http","database":"Hausdaten","name":"Influx Raspi 4 Hausdaten","usetls":false,"tls":""}]
Veröffentlicht unter Blogroll | Verschlagwortet mit , , , , , , , , , , , , , | Schreib einen Kommentar

Das Rätsel der Bienenschüler

Die Schüler der Bienenschule haben die folgende Aufgabe leider nicht lösen können und müssen nun in den Ferien üben. Kannst du die Aufgabe lösen? Wenn nicht hilft vielleicht etwas Honig 🙂

Es gibt 7 Bienenwabe mit je 6 Kanten.
Jede Kante hat eine Zahl aus dem Bereich 1-6. Keine Zahl ist doppelt.

Die Waben sind so zu legen, dass eine Wabe in der Mitte liegt und die restlichen 6 Bienenwaben darum angelegt werden.
Dabei soll die Zahl der angelegten Wabe zu der Zahl an der Kante passen wo es angelegt wird.
Zusätzlich muss die rechte bzw. linke Kante der angelegten Wabe mit der benachbarten angelegten Wabe überein stimmen.

Eine Lösung – leider passt sie nicht.

Fast richtig – aber nicht die richtige Lösung.

So trival wie es ausschaut ist die Aufgabe bei weitem nicht! Es gibt 7 Waben die in der Mitte liegen können. Die restlichen 6 können beliebig verteilt liegen und haben dazu noch 6 Möglichkeiten eine Stellung einzunehmen.

Wenn ein Stein in der Mitte liegt kann man ihn an 6 verschiedenen Stellen anlegen und hat dafür 6 Stellungen. Bei der nächste Wabe hat man noch 5 Stellen wo man anlegen kann, aber immer noch 6 Stellungen. Bei der nächste Wabe hat man noch 4 Stellen usw.
Diese Möglichkeiten multipliziert man miteinander = 36*30*24*18*12*6 = 33.592.320
Jetzt noch die 7 Möglichkeiten beachten ergibt eine Zahl von 235.146.240 Möglichkeiten für dieses Rätsel

Die Aufgabe

Finde die Kombination wo die oben genannte Bedingung richtig ist 🙂

Kleine Hilfe

List waben = new List()
             {
                 new Spielstein(1, new[] {1, 2, 3, 4, 5, 6}),
                 new Spielstein(2, new[] {1, 6, 4, 2, 5, 3}),
                 new Spielstein(3, new[] {1, 4, 3, 6, 5, 2}),
                 new Spielstein(4, new[] {1, 4, 6, 2, 3, 5}),
                 new Spielstein(5, new[] {1, 6, 2, 4, 5, 3}),
                 new Spielstein(6, new[] {1, 6, 5, 4, 3, 2}),
                 new Spielstein(7, new[] {1, 6, 5, 3, 2, 4})
             };
Veröffentlicht unter Aus dem Leben | Verschlagwortet mit , , , , | 1 Kommentar