// This example sketch connects to the public shiftr.io instance and sends a message on every keystroke. // After starting the sketch you can find the client here: https://www.shiftr.io/try. // // Note: If you're running the sketch via the Android Mode you need to set the INTERNET permission // in Android > Sketch Permissions. // // by Joël Gähwiler // https://github.com/256dpi/processing-mqtt import processing.data.*; import mqtt.*; MQTTClient client; float energy_val = 1111; float today = 0; float yesterday = 0; float _prev_energy = 0; float current_verbrauch = 0; PGraphics HISTOGRAM_BUFF; int current_TIME_ID = 0; int current_VERBRAUCH = 0; int itick = -1; // 8640 requests per day! // request each 10s int request_amount = 8640; int[] verbauche = new int[request_amount]; class Adapter implements MQTTListener { void clientConnected() { client.subscribe("tele/tasmota_C9ECC1/SENSOR"); println("client connected"); } void messageReceived(String topic, byte[] payload) { // println("new message: " + topic + " - " + new String(payload)); String str = new String(payload); JSONObject j = parseJSONObject(str); JSONObject energyo = j.getJSONObject("ENERGY"); // Extract the timestamp from the JSON String timestamp = j.getString("Time"); String daytime = timestamp.split("T")[1]; current_TIME_ID = getMessageCountForTime(daytime); energy_val = energyo.getFloat("Total") ; current_verbrauch = energy_val - _prev_energy; today = (int)energyo.getFloat("Today"); yesterday = energyo.getFloat("Yesterday"); current_VERBRAUCH = (int)current_verbrauch*1000; DRAW_ON_BUFFER(current_TIME_ID, (int)(current_verbrauch*1000)); //println ( energyo.getFloat("Current")[0] ); /* if(itick>-1){ verbauche[itick] = (int)(current_verbrauch*2000); } itick++; if(itick>799){ itick=0; clearHISTOGRAM(); } */ _prev_energy = energy_val; /// println(energyo); } void connectionLost() { println("connection lost"); } } Adapter adapter; void setup() { size(800,600); background(0); noCursor(); smooth(); HISTOGRAM_BUFF = createGraphics(8640, 128); adapter = new Adapter(); client = new MQTTClient(this, adapter); client.connect("mqtt://172.22.22.22", "processing"); frameRate(1); } void clearHISTOGRAM(){ for(int i=0;i< 800; i++){ verbauche[i] = 0; } } void draw() { UPDATE(); } void UPDATE(){ background(0); fill(0); textSize(9); //textAlign(CENTER); //text( round(current_verbrauch * 1000) +"", width/2,height/2); text("STROMVERBRAUCH HEUTE BIS JETZT: " + today +" / GESTERN GESAMT: " + yesterday, 20,20); // --------------------------------------------- // --------------CURRENT VERBRAUCH-------------------- // --------------------------------------------- pushMatrix(); translate(width-10,80); fill(255); rotate(radians(90)); text("JETZT", 0,0 ); popMatrix(); image(HISTOGRAM_BUFF,-current_TIME_ID+width-20,20); stroke( 44); line(0,200,width,200); fill(111); text("STROMVERBRAUCH DER LETZTEN ZWEI STUNDEN", 10,14); // --------------------------------------------- // --------------DAYLONG VERBRAUCH-------------------- // --------------------------------------------- image(HISTOGRAM_BUFF,20,250,width-20,200); float bit_h = float(width)/24.0; for(int i=0;i<24;i++){ fill(255); text(i , i*bit_h +4, 230); } stroke( 44); line(0,400,width,400); fill(111); text("STROMVERBRAUCH IM VERLAUF DES TAGES", 10,214); // --------------------------------------------- // --------------LASTDAYS VERBRAUCH-------------------- // --------------------------------------------- textSize(14); fill(255); text( "VERBRAUCH MOMENTAN = " + current_VERBRAUCH, 20,430 ); textSize(11); fill(200); text( "ENTSPRICHT ~ " + current_VERBRAUCH*200 + " x HANDY LADEGERÄTEN", 20,460 ); text( "ENTSPRICHT ~ " + current_VERBRAUCH*2 + " x FERNSEHGERÄTEN", 20,480 ); text( "ENTSPRICHT ~ " + current_VERBRAUCH + " x WASSERKOCHERN", 20,500 ); // ----------------------------- fill(255); textSize(14); text( "VERBRAUCH SEIT TAGESBEGIN = " + today, 290,430 ); fill(200); textSize(11); text( "ENTSPRICHT ~ " + round(today*200) + " x HANDY LADEGERÄTEN", 290,460 ); text( "ENTSPRICHT ~ " + round(today*2) + " x FERNSEHGERÄTEN", 290,480 ); text( "ENTSPRICHT ~ " + round(today) + " x WASSERKOCHERN", 290,500 ); fill(255); textSize(14); text( "VERBRAUCH GESTERN " + yesterday, 590,430 ); fill(200); } void drawALLDAY(){ float cut = float(width) / float(request_amount/10); for(int i=0;i< request_amount/10; i++){ noStroke(); fill(222); rect(i,22,1,random(222)); } } void DRAW_ON_BUFFER(int _cid, int _v) { //println(_v); HISTOGRAM_BUFF.beginDraw(); //dynamicGraphics.background(255); // Set the background to white // draw stroke with alpha of strength _v HISTOGRAM_BUFF.stroke(255, 128+_v*.5); if(_v >= 128){ // if has crazy peak - get red! HISTOGRAM_BUFF.stroke(255,0,0); // Set stroke color to red } if(_v >=127){_v=127;} if(_cid >=8640){_v=8639;} HISTOGRAM_BUFF.line(_cid, 0, _cid, _v); HISTOGRAM_BUFF.endDraw(); } void drawHISTOGRAM(){ for(int i=0;i< 800; i++){ fill(11); noStroke(); if(itick==i+1){ fill(255,0,0);} float yi = verbauche[i]; rect(i,height,1,-yi*2+2); } } /* void keyPressed() { // todo _ check if connected client.publish("/hello", "world"); } */ int getMessageCountForTime(String time) { // Split the time string into hours, minutes, and seconds String[] parts = split(time, ':'); int hours = int(parts[0]); int minutes = int(parts[1]); int seconds = int(parts[2]); // Convert the time to seconds int totalSeconds = hours * 3600 + minutes * 60 + seconds; // Calculate the count based on 10-second intervals int count = totalSeconds / 10; return count; }