HowTo: Duty Cycle der letzten 24h aus influxDB holen

Node-RED als CCU3/RaspberryMatic Addon, WebApp, HomeKit, ...

Moderator: Co-Administratoren

Antworten
ptweety
Beiträge: 522
Registriert: 07.01.2017, 16:48
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 48 Mal
Danksagung erhalten: 66 Mal

HowTo: Duty Cycle der letzten 24h aus influxDB holen

Beitrag von ptweety » 07.11.2018, 22:34

Hi,

im RedMatic Wiki ist beschrieben, wie man seine Messwerte in die InfluxDB speichern kann. Dort liegen sie nun und warten auf das nächste Housekeeping. Doch bevor die Daten in den Orkus gehen, will ich noch was damit machen.

Hier ist ein einfacher Flow, mit dem ich die Daten der letzten 24h zum Duty Cycle wieder aus der InfluxDB rausholen und im Dashboard anzeigen lassen kann:

flow.png

Code: Alles auswählen

[{"id":"d684ed1d.1daca","type":"influxdb in","z":"d904ac17.536468","influxdb":"","name":"DutCycle","query":"SELECT mean(\"value\") AS \"mean_value\" FROM \"redmatic\".\"autogen\".\"CCU3/DUTY_CYCLE\" WHERE time > now() - 24h GROUP BY time(10m) FILL(null)","rawOutput":true,"precision":"","retentionPolicy":"","x":460,"y":100,"wires":[["6cf42b22.0380ec","9549a391.f8d048"]]},{"id":"54323d44.dfd114","type":"inject","z":"d904ac17.536468","name":"5m","topic":"","payload":"","payloadType":"date","repeat":"300","crontab":"","once":true,"onceDelay":"3","x":310,"y":100,"wires":[["d684ed1d.1daca"]]},{"id":"6cf42b22.0380ec","type":"change","z":"d904ac17.536468","name":"","rules":[{"t":"delete","p":"topic","pt":"msg"},{"t":"set","p":"payload","pt":"msg","to":"$.payload.results.series.[\t   (\t       {\t           \"series\": [$.name],\t           \"labels\": [\"\"],\t           \"data\": [\t               [\t                   $.values.(\t                       $[1] != null ? {\t                           \"x\": $[0].$toMillis(),\t                           \"y\": $[1]\t                       }\t    \t                   ) \t               ]\t           ]\t\t       }\t   )\t]","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":640,"y":100,"wires":[["e53c9e3.6b9aa6","48fc57ee.c887"]]},{"id":"e53c9e3.6b9aa6","type":"ui_chart","z":"d904ac17.536468","name":"Chart","group":"937d90ca.8d8b","order":1,"width":0,"height":0,"label":"","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"No data","dot":false,"ymin":"0","ymax":"100","removeOlder":"24","removeOlderPoints":"200","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"colors":["#1F77B4","#AEC7E8","#FF7F0E","#2CA02C","#98DF8A","#D62728","#FF9896","#9467BD","#C5B0D5"],"useOldStyle":false,"x":810,"y":100,"wires":[[],[]]},{"id":"9549a391.f8d048","type":"debug","z":"d904ac17.536468","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":610,"y":140,"wires":[]},{"id":"1336fd0d.66716b","type":"comment","z":"d904ac17.536468","name":"Duty Cycle der letzten 24h aus influxDB holen","info":"Einige nützliche Links:\n\n* [InfluxDB Docs](https://docs.influxdata.com/influxdb/)\n* [JSONata Exerciser](http://try.jsonata.org/)\n* [JSONata Docs](http://docs.jsonata.org/index.html/)\n* [Node-RED-Dashboard Charts](https://github.com/node-red/node-red-dashboard/blob/master/Charts.md)","x":410,"y":60,"wires":[]},{"id":"48fc57ee.c887","type":"debug","z":"d904ac17.536468","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":810,"y":140,"wires":[]},{"id":"937d90ca.8d8b","type":"ui_group","z":"","name":"Duty Cycle","tab":"ddaccebd.e9458","order":12,"disp":true,"width":"6","collapse":false},{"id":"ddaccebd.e9458","type":"ui_tab","z":"","name":"Mein Haus (RedMatic)","icon":"home","order":1}]

(A) InfluxDB

Zuerst hole ich die Daten aus der Datenbank über den InfluxDB-Node. Dazu wird alle 5 Minuten über den Inject-Node der Aufruf ausgelöst. Dies geschieht dann mit einem passenden SELECT Aufruf, in welchem die 10 minütigen Mittelwerte über die letzten 24h ermittelt werden. Die Daten lasse ich mir in der Rohform zurückgeben (Haken bei Raw Output):

influxdb.png

Code: Alles auswählen

SELECT mean("value") AS "mean_value" FROM "redmatic"."autogen"."CCU3/DUTY_CYCLE" WHERE time > now() - 24h GROUP BY time(10m) FILL(null)
Hilfe dazu findet man in der --> Doku von InfluxDB <--


(B) Change

Jetzt müssen diese aber noch aufbereitet werden. Im Change-Node passiert dann die Magie mit Hilfe von JSONata:

change.png

Code: Alles auswählen

$.payload.results.series.[
   (
       {
           "series": [$.name],
           "labels": [""],
           "data": [
               [
                   $.values.(
                       $[1] != null ? {
                           "x": $[0].$toMillis(),
                           "y": $[1]
                       }
    
                   ) 
               ]
           ]

       }
   )
]
Ausprobieren kann man das übrigens mit seinem eigenen Payload (dazu einfach einen Debug-Node in den Flow hängen und schauen, was der ausspuckt) auch im --> JSONata Versuchslabor <--. Hilfe dazu findet man in der --> Doku von JSONata <--


(C) Chart

Die Einstellung des Chart-Node ist dann nicht mehr so schwierig:

chart.png
Welche Möglichkeiten der Chart-Node so bietet und warum der Payload so komisch formatiert werden muss steht natürlich wieder in der --> Doku zum Chart-Node <--

Und so sieht es dann aus (kaum ein Unterschied zum Original, nur ein längerer Zeitraum wird dargestellt):

dashboard.png

PS: der komplette Post inkl. Bildern kann natürlich auch gerne im Wiki wiederverwendet werden.

hobbyquaker
Beiträge: 3978
Registriert: 12.07.2009, 20:01
Hat sich bedankt: 17 Mal
Danksagung erhalten: 176 Mal
Kontaktdaten:

Re: HowTo: Duty Cycle der letzten 24h aus influxDB holen

Beitrag von hobbyquaker » 08.11.2018, 17:43

Cool, Danke für das HowTo. Ich übertrags bei Gelegenheit ins Wiki. Hat mir auch Inspiration gegeben für ein weiteren Beispiel-Flow: Für eine Erkennung ob es notwendig ist den Garten zu bewässern könnte man sich aus der Influx die Regenmenge der letzten 2 Tage holen, das kombiniert mit einer vorhergesagten Regenmenge für den Folgetag von irgendeinem Wetter-Service wäre ne nette Sache. Aber hat ja noch Zeit bis zum Frühling ;-)

ptweety
Beiträge: 522
Registriert: 07.01.2017, 16:48
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 48 Mal
Danksagung erhalten: 66 Mal

Re: HowTo: Duty Cycle der letzten 24h aus influxDB holen

Beitrag von ptweety » 08.11.2018, 18:08

Weitere Möglichkeiten sind z.B.:
  • RSSI-Liste und diverse andere Gesundheitswerte der CCU/Aktoren anzeigen [1]
  • Initial-Werte für diverse Aktoren bei CCU/RedMatic Start auslesen und an Dashboard/HomeKit weiterreichen [2]
  • Licht-Simulation bei Abwesenheit auf Basis der Historie
*1:
1.png

Code: Alles auswählen

[{"id":"c776b18e.a0065","type":"influxdb in","z":"26c1324d.aa616e","influxdb":"","name":"RSSI_Device","query":"SELECT round(mean(\"value\")) as \"mean\", max(\"value\") as \"min\", min(\"value\") as \"max\" FROM \"redmatic\".\"autogen\"./0\\/RSSI_DEVICE/ WHERE time > now() - 24h","rawOutput":true,"precision":"","retentionPolicy":"","x":370,"y":520,"wires":[["4b2d4056.4901e","d2fd758f.ecfd78"]]},{"id":"3e9e24fa.91b5d4","type":"inject","z":"26c1324d.aa616e","name":"5m","topic":"","payload":"","payloadType":"date","repeat":"300","crontab":"","once":true,"onceDelay":"3","x":230,"y":520,"wires":[["c776b18e.a0065"]]},{"id":"4b2d4056.4901e","type":"change","z":"26c1324d.aa616e","name":"","rules":[{"t":"delete","p":"topic","pt":"msg"},{"t":"set","p":"payload","pt":"msg","to":"$.payload.results.[\t   {\t       \"series\": $filter(\t           $.series[0].columns,\t           function($v, $i) {$i > 0}\t       ),\t       \"labels\": $.series.name.$substringBefore(\":\"),\t       \"data\": $zip(\t           [[$.series.values.$[1]]],\t           [[$.series.values.$[2]]],\t           [[$.series.values.$[3]]]\t       )[0]\t   }\t]","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":560,"y":520,"wires":[["f995833b.ff6d68"]]},{"id":"f995833b.ff6d68","type":"ui_chart","z":"26c1324d.aa616e","name":"Chart","group":"d4901f6.e52e3e","order":0,"width":"6","height":"18","label":"","chartType":"horizontalBar","legend":"false","xformat":"auto","interpolate":"bezier","nodata":"No data","dot":false,"ymin":"-95","ymax":"-45","removeOlder":"1","removeOlderPoints":"200","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"colors":["#1F77B4","#AEC7E8","#FF7F0E","#2CA02C","#98DF8A","#D62728","#FF9896","#9467BD","#C5B0D5"],"useOldStyle":false,"x":730,"y":520,"wires":[[],[]]},{"id":"d2fd758f.ecfd78","type":"debug","z":"26c1324d.aa616e","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":530,"y":560,"wires":[]},{"id":"d4901f6.e52e3e","type":"ui_group","z":"","name":"RSSI Device","tab":"ddaccebd.e9458","order":10,"disp":true,"width":"6","collapse":false},{"id":"ddaccebd.e9458","type":"ui_tab","z":"","name":"Mein Haus (RedMatic)","icon":"home","order":1}]
*2:
2.png

Code: Alles auswählen

[{"id":"c4c97d92.46ac68","type":"split","z":"26c1324d.aa616e","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"topic","x":850,"y":620,"wires":[["867b7f59.1b377"]]},{"id":"6036b973.907cf8","type":"influxdb in","z":"26c1324d.aa616e","influxdb":"","name":"Actual_Temperature","query":"SELECT last(\"value\") AS \"value\" FROM \"redmatic\".\"autogen\"./.*1\\/ACTUAL_TEMPERATURE$/ WHERE time > now() - 24h FILL(null)","rawOutput":true,"precision":"","retentionPolicy":"","x":400,"y":620,"wires":[["f6faab56.506f48","efcaa795.769a2"]]},{"id":"f6faab56.506f48","type":"change","z":"26c1324d.aa616e","name":"","rules":[{"t":"delete","p":"topic","pt":"msg"},{"t":"set","p":"payload","pt":"msg","to":"$merge(\t   $map(\t       $.payload.results.series,\t       function($v, $i) {\t           {\t               $string($i): {\t                   \"label\": $v.name.$substringBefore(\":\"),\t                   \"value\": $v.values[0][1]\t               }\t           }\t       }\t   )\t)","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":680,"y":620,"wires":[["c4c97d92.46ac68"]]},{"id":"efcaa795.769a2","type":"debug","z":"26c1324d.aa616e","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":650,"y":660,"wires":[]},{"id":"71b706c.6a12678","type":"inject","z":"26c1324d.aa616e","name":"init","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"onceDelay":"3","x":230,"y":620,"wires":[["6036b973.907cf8"]]},{"id":"867b7f59.1b377","type":"switch","z":"26c1324d.aa616e","name":"","property":"topic","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"num"},{"t":"eq","v":"1","vt":"num"},{"t":"eq","v":"2","vt":"num"},{"t":"eq","v":"3","vt":"num"},{"t":"eq","v":"4","vt":"num"},{"t":"eq","v":"5","vt":"num"},{"t":"eq","v":"6","vt":"num"},{"t":"eq","v":"7","vt":"num"}],"checkall":"false","repair":false,"outputs":8,"x":990,"y":620,"wires":[["948a76c0.afcf28"],["b089ab48.fda648"],["8fc3b4a0.458298"],["832f4af2.ecede8"],["439bfa77.d29eb4"],["30d434a1.48fad4"],["1f525afb.328d5d"],["b1b9276e.52196"]]}]

Antworten

Zurück zu „RedMatic“