Jump to content

The Bartender - Automatisk drikke smaker bedre


Moskus

623 views

Når man har automatisert lys, varme, dørlåser, garasjeporter, sengetepper, og så videre, så er selvfølgelig spørsmålet: "Hvordan kan jeg nå gjøre livet enklere for meg selv?" Svaret er åpenbart: Den tiden det tar å helde drikke fra en beholder til et glass er jo helt bortkastet, så det må jo automatiseres!

 

Og så er det jo selvfølgelig kulere. ;) 

 

Dermed ble The Bartender™ født. En liten 5V slangepumpe styrt av en ESP8266, et par slangelengder, litt tålmodighet, og voila!

 

 

Den kan selvfølgelig gjøre mer enn det:

 

 

Deler

 

Oppkobling

Koble 3V og GND på NodeMCUen til VCC og GND på reléet. Koble D1 på NodeMCUen til Vin på reléet.

Utgangene på releet kobles i serie på strømforsyningen.

 

20201125_201543.jpg

 

 

Kode

Jeg styrer den via MQTT. Det var enkleste måten å få inn og ut data fra den uten for mye styr. Den har følgende topics.

  • /motor/get - sender status på motoren, verdi: 1 eller 0
  • /motor/set - setter motoren på eller av, verdi: 1 eller 0
  • /runtime - heltall på antall sekunder motoren skal kjøre
  • /runtimestatus - rapporterter fortløpende hvor lenge i prosent motoren har kjørt av sekunder satt med /runtime (verdi: 0-100)

 

Alt sendes til "bartender/1", det siste /1 i tilfelle jeg skulle finne på å lage noen til… ;) 

 

Du trenger Arduio Studio og ha installert PubSubClient (https://pubsubclient.knolleary.net)

 

Bartender.ino:

Spoiler


#include <ESP8266WiFi.h>
#include <PubSubClient.h>

#define RelayPin 5    //D1
#define BUILTIN_LED 2 //D0

const char *ssid = "WIFI-SSID";
const char *password = "WIFI-PASSORD";
const char *mqtt_server = "IP_TIL_BROKER";

String clientId = "bartender1";
const char *topic = "bartender/1";
const char *motor_topic = "bartender/1/motor/set";
const char *motor_status_topic = "bartender/1/motor/get";
const char *runtime_topic = "bartender/1/runtime";
const char *runtime_status_topic = "bartender/1/runtimestatus";

unsigned long lastMotorSet;
unsigned long lastRuntimeSet;
unsigned long lastRuntimeUpdate;
float runtimeOriginal;
float runtime;
int motorStatus;
bool ignoreNextMotorStatusMessage;

WiFiClient espClient;
PubSubClient client(espClient);

void setup()
{
  //Set pins at output
  pinMode(BUILTIN_LED, OUTPUT);
  pinMode(RelayPin, OUTPUT);

  //Turn off motor
  digitalWrite(BUILTIN_LED, HIGH);
  digitalWrite(RelayPin, HIGH);

  //Connect to wifi and MQTT broker
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}

void setup_wifi()
{
  delay(10);

  // Connect to wifi
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  //Wait until connected...
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }

  randomSeed(micros());

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

//Handle reconnect if necessary
void reconnect()
{
  // Loop until we're reconnected
  while (!client.connected())
  {
    Serial.print("Attempting MQTT connection...");

    if (client.connect(clientId.c_str()))
    {
      Serial.println("connected");
      client.subscribe(motor_topic);
      client.subscribe(runtime_topic);
    }
    else
    {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 2 seconds");
      // Wait 5 seconds before retrying
      delay(2000);
    }
  }
}

//Handle incomming MQTT callbacks
void callback(char *topic, byte *payload, unsigned int length)
{
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  String stringPayload = "";
  for (int i = 0; i < length; i++)
  {
    //Serial.print((char)payload[i]);
    stringPayload = stringPayload + (char)payload[i];
  }
  //Serial.println();
  Serial.println(stringPayload);

  if (strcmp(runtime_topic, topic) == 0)
  {
    Serial.println("Detected runtime_topic");
    lastRuntimeSet = millis();
    lastRuntimeUpdate = millis();
    runtime = stringPayload.toFloat() * 1000;
    runtimeOriginal = runtime;
  }

  if (strcmp(motor_topic, topic) == 0)
  {
    // if (ignoreNextMotorStatusMessage == false)
    // {
      Serial.println("Detected motor_topic");
      lastMotorSet = millis();
      if (stringPayload == "1")
        if (motorStatus == 0)
          MotorOn();
      if (stringPayload == "0")
        if (motorStatus == 1)
          MotorOff();
  }
}

unsigned long lastReadTime;
void loop()
{

  if (!client.connected())
  {
    reconnect();
  }
  client.loop();

  delay(1);

  if (runtime > 0)
  {
    runtime = runtime - (millis() - lastRuntimeUpdate);
    lastRuntimeUpdate = millis();
  }
  if (runtime < 0)
    runtime = 0;

  if (lastRuntimeSet > lastMotorSet)
  {
    if (runtime > 0)
    {
      if (motorStatus == 0)
      {
        //ignoreNextMotorStatusMessage = true;
        MotorOn();
      }
    }
    else
    {
      if (motorStatus == 1)
      {
        //ignoreNextMotorStatusMessage = true;
        MotorOff();
      }
    }
  }

  if (millis() - lastReadTime > 250)
  {
    if (motorStatus == 1 && runtime > 0)
    {
      float percent = (runtimeOriginal - runtime) / runtimeOriginal * 100;
      String percenString = String(percent, 0);
      client.publish(runtime_status_topic, percenString.c_str());
      Serial.print(percent);
      Serial.print("% -- ");
    }

    Serial.println(runtime);
    lastReadTime = millis();
  }
}

void MotorOn()
{
  motorStatus = 1;

  digitalWrite(RelayPin, LOW);
  digitalWrite(BUILTIN_LED, LOW);

  client.publish(motor_status_topic, "1");
  client.publish(runtime_status_topic, "0");
  Serial.println("Turning on...");
}

void MotorOff()
{
  motorStatus = 0;

  digitalWrite(BUILTIN_LED, HIGH);
  digitalWrite(RelayPin, HIGH);

  client.publish(motor_status_topic, "0");
  client.publish(runtime_status_topic, "100");
  Serial.println("Turning off...");
}

 

 

I HomeSeer ser det slik ut:

image.png

 

… som er satt opp i mscMQTT slik:

image.png

 

Dette kan man selvsagt enkelt legge til andre systemer, som Home Assistant, Node-Red eller Homey hvis man ønsker.  :)

 

Kalibrering

En typisk drink er visstnok 40 ml. Jeg hadde et målebeger og kjørte pumpa til det nådde opp til 0,4 dl. Det tok 19,5 sekunder som jeg runder opp til 20. Dermed får vi sammenhengen

 

Kjøretid = Drink_størrelse * (20 sek /40 ml) = ca. drinkstørrelse * 0,5.

 

Men det kan være annerledes for din pumpe og strømforsyning.

 

 

Alexa

Den øverste devicen (merket 4052) er egentlig bare på/av som er lagt inn i Alexa. Der har jeg også bare laget en rutine som skrur på device 4052 når Alexa hører "pour me a drink". Når devicen blir skrudd på har jeg et event som sender "20" til topic "/runtime", og skrur seg selv av (dvs. til "inactive" etter 20 sekunder).

 

image.png

 

 

 

Så nå står den her på kjøkkenbenken. Tror jeg må få meg et barskap den kan passe inn i...

20201125_201449.jpg 20201125_201512.jpg

 

2 Comments


Recommended Comments

🙌🏼 Jeg har langt fra samme kompetanse og ser for meg at det hadde blitt et evighetsprosjekt, men så med ett for meg å sette opp denne med et knippe gode ingredienser. 
dispenser1 - vodka

dispenser2 - gin

dispenser3 - ingefærøl

dispenser4 - tonic

dispenser5 - limejucie

 

Alexa make a moscow mule

20sek dispenser1 - 5 sek dispenser5 - 80sek dispenser3

 

Alexa make a gin tonic

20sek dispenser2 - 60sek dispenser4 - 2sek dispenser5

 

Hadde vært genialt en sen lørdagskveld når man egentlig har lyst på en GT men ikke "orker" å lage 😂

 

  • Like 1
  • Haha 1
Link to comment
16 timer siden, kåres skrev:

Hadde vært genialt en sen lørdagskveld når man egentlig har lyst på en GT men ikke "orker" å lage 😂

Må bygge den inn i et kjøleskap, men det er jo mulig! :D 

Link to comment
Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Similar Content

    • By Guahtdim
      Dette er en plugin for å kunne styre Daikin og Panasonic varmepumpe med wifi-modul
       
      Link til siste versjon
      DakinSeer 0.0.5.3
       
      (NB: Kun testet i Windows )
      Kompatibel med Google Home
      Hvis du allerede har installert tidligere versjoner så slett alle enheter og opprett på nytt
       
      Hva denne plugin gjør:
      Gir deg en oversikt over forskjellige status

      Gir deg mulighet til å styre varmepumpen fra "oversiktbildet"
      eller 
      legge det inn som en action i en (eller flere) events

       

       
      Hvordan sette opp :
      VIKTIG!!! Stopp Homeseer og ta en kopi av hele katalogen til Homeseer (normalt "c:\program files (x86)\Homeseer HS3" for Windows) og legg kopien på ett trygt sted i tilfelle du trenger å gå tilbake. Pakk ut filen i din Homeseer katalog - pass på at du får følgende oppsett (katalogen "Homeseer HS3" skal inneholde 2 nye filer HSPI_DaikinSeer.exe og HSPI_DaikinSeer.exe.config, mens du i katalogen Homeseer HS3\bin og Homeseer HS3\html\images skal ha fått en ny underkatalog - DaikinSeer)   Restart Homeseer Gå inn på Homeseer->Plugins->Manage og trykk enable på DaikinSeer  
      Hvordan å legge inn en varmepumpe
       
      Daikin
      For å kunne legge inn en varmepumpe så må du vite ip adressen til den.  Dette kan du finne i f.eks. routeren din. 
       
       
      Panasonic
       
      General Settings
      I "General Settings" vil du kunne sette opp hvor lang tid det skal gå mellom hver gang det hentes info fra varmepumpen (der er det en copy&paste bug ja). Time between triggering if true skal egentlig være "Time between heat pump check" eller noe.
      Du kan sette loggnivå.
      Og du får opp antall varmepumper tilknyttet (Number of heat pumps to check)

       
      Sette temperatur offset for alle varmepumper som kjøres av plugin

      Ved å sette noe annet enn 0 grader på heat point offset så vil temperaturene du ser i HomeSeer være justert i forhold til offset. Si at du setter det til -2,5 grader. Da vil du se 24 grader i HomeSeer på Heat point, men plugin vil ha fått inn 26,5 grader. Det samme vil også gjelde hvis du endrer temperatur. Hvis du endrer fra 24 til 23 grader så sendes 25,5 grader til varmepumpen.
      NB: Dette gjelder kun for plugin så hvis noen begynner å endre med fjernkontroll eller app på telefonen så vil ikke offset gjelde fra disse. Fjernkontroll vil heller ikke få med seg endringer sendt til varmepumpen.
       
      Streamer mode, Power mode og Econo mode(kun for Daikin) 

      Ved å velge en ip adresse fra dropdown som sier "Choose ip address for adding power and streamer" så vil det gjøres en test på om denne enheten har en eller flere av disse mulighetene. Hvis det blir testet ok så legges dette til i HomeSeer for gjeldende enhet.
       
       
      Endringslogg
      0.0.5.3 - Oppdatert versjonsnummer for innsending av https request til Panasonic Comfort Cloud. Vil hjelpe alle som får feilmeldingen "New version app has been published","code":4106. Takk til @Olex.
      0.0.5.2 - Lagt til mulighet for Daikin pumper å vise momentanforbruk av kW. Takk til @Kenneth og @Sleepy81 for testing.
      0.0.5.0 - Lagt til mulighet for Daikin pumper å vise dagsforbruk av kWh.
      0.0.4.2 - Fikset temp dropdown i action. Grunnet forskjell mellom US og NO regional settings med tanke på desimalseparator så ble den feil. Tydeligvis ikke noe de fleste med norsk oppsett bruker. Takk til @toonwolffor hjelp med å finne bug.
      0.0.4.0 - Endret slik at DaikinSeer enheter går inn i Google Home. Ulempen er at vi nå kun kan endre i hele grader (ikke halve som før). Takk til @toonwolffor hjelp
      0.0.3.0 - Og plutselig så kan man styre både Panasonic og Daikin varmepumper fra plugin. Takk til @toonwolffor hjelp til å finne ut av Panasonics api. Ikke alt er testet, men det vanlige funksjoene ser ut til å fungere som de skal for begge merker.
      0.0.1.6 - Fikset opp i Econo, Power og Streamer mode. Lagt til mulighet for styring av vertikalt spjeld. Takk til @hflatoey og @Kenneth for inspirasjon og feillogger.
      0.0.1.3 - Oppdatert slik at Connected vil endre seg til verdier over 0 hvis det er feil. I tillegg lagt til nytt ikon og ekstra tekst når det kommer feil tilbake fra Daikin varmepumpe
      0.0.1.1 - Lagt inn mulighet for å legge inn offsetverdi på temperatur. Denne vil gjelde for alle varmepumper som du kjører. I tillegg gitt mulighet til å legge til EconoMode, PowerMode og StreamerMode (hvis du har det på din varmepumpe). Disse tre modes må legges til ved å velge dette fra dropdown i Ip-config.
      0.0.0.9 - Fikset feil nummer brukt når man skulle skifte til FAN mode. Også oppdatert slik at plugin husker siste temperatur hvis man skifter mellom modes og en av de er FAN siden FAN ikke rapporterer temperatur tilbake (Dette forutsetter at plugin har fått en temperatur før man skifter til FAN mode. Hvis man starter i FAN mode vil default temperatur være 18 grader for kjøling og 10 grader for oppvarming). Takk til @Kenneth for å ha funnet denne.
      0.0.0.8 - Fikset håndtering av tall med desimaler fra Wifi adapter når man ikke kjører US oppsett.
      0.0.0.6 - Endret bygging av temperatur dropdown for å unngå feil ved desimal verdier0.0.0.7 - Fikset visning av temperatur ikoner + ekstra sjekk når man lager enhet slik at man ikke kan ha mer enn en varmepumpe per Ip
      0.0.0.5 - endret shum tilbake, men sørget for us-formatering av temperatur sendt til varmepumpe fra HomeSeer
      0.0.0.4 - endret shum i til å ikke ha verdi (fra shum=0&.. til shum=&..)
      0.0.0.3 - Fikset flere upper/lower case  i image-path
      0.0.0.2 - Lagt på litt mer debug logging og fikset noen upper/lower case i image-path
      0.0.0.1 - Første versjon
       
       
      Problemer/utfordringer/videreutvikling
      Få inn PowerMode, Streamer og EcoMode for de enheter som støtter dette. Automagisk legge dette inn i oppstart. Individuelt oppsett av offset for de som har mer enn en varmepumpe. Gjenopprette devicer tilbake til standard hvis man f.eks. har slettet eller gjort endringer på enhetene sine. Prøve å beholde deviceId hvis denne finnes. Få til en oppdatering av allerede eksisterende enheter hvis man har gjort rettelser på de. Kunne selv velge default temperatur hvis plugin ikke har noen temperatur å gå ut ifra Kunne vise brukt energi (bare Daikin modeller) Legge inn mulighet for å kjøre en offset på ønsket temperatur Kunne sende Streamer on/off og Powerful on/off for de som har dette Det skal ikke være mulig å lage mer enn en enhet/samling med devicer per ip. Hvis den allerede eksisterer så skal man få opp en advarsel. Hvordan få satt en drop-down til å ha korrekt formatering i forhold til hva HomeSeer forventer.  
       
      (Jeg skjønner ikke hvorfor det blir med ett bilde under her. Slettet det flere ganger, men det dukker opp alikevel)

    • By Fjosepose
      Hei
      Jeg har nå begynt å "koble" meg på eksterne MQTT-devicer, og først ut er min dashboard tablet hvor planen er å styre "Wallpanel" over MQTT. Planene er å gjøre kommandoene reload, relaunch, wake tilgjengelige i HS4.
       
      For å gjøre dette bruker jeg den (foretrukkede metoden) plug-in devices hvor jeg velger en topic og videre fra den genererer en HS4-device. Problemet mitt er å lage en fornuftig gruppering hvor jeg har én parent device og funksjonene reload, relaunch, wake som hvert sitt child device. Det klarer jeg ikke helt på en reperarbar måte. I hovedsak så genereres det automatisk en ny parent for hver topic jeg legger til (assosierer).
       
      Noen spesielle triks som jeg bør kunne her?
       
    • By Fjosepose
      Jeg ser av og til innom "z-wave vinduet" i Homeseer, og legger merke til at det ofte rapporteres om feil. Her er et utdrag:
       

       
      Er dette normalt, eller må det noe medisin til? Spør for en venn.
       
    • By Fjosepose
      Hei
      Jeg sliter med mcsMQTT og tror det er en feil i plug-in´en for HS4.
       
      Utvikleren mener at jeg skal kunne sub og pub på samme topic name (selv om jeg mener å ha lest at han anbefaler sepatate topics for set and get). Jeg får ikke dette til å fungere.
       
      Dersom jeg benytter ulike topic names for set og get (finnes en option for dette i ioBroker) som mottar på /topic og sender ut/svarer på topic/set så fungerer det (nesten) i HS4. Problemet er bare at da får jeg feedback siden mscMQTT tar innkommende verdi(subscribed) og publisher den ut broker igjen. Broker gjør som jeg tror er riktig...den svarer og sender echo av mottatt verdi tilbake til mcsMQTT...og så har vi det gående...
       
      Dersom jeg bruker fullstendige forskjellige topics som ikke har noe med hverandre å gjøre så fungerer det, med da jobber jeg ikke på samme "variabel". Det jeg ønsker er:

      Overstående fungerer mellom feks MQTT Explorer-client og ioBroker-broker, og grunnen til at jeg ønsker det slik er for å slippe "glue logic" i form av Node-Red. Forøvrig ikke noe feil med Node-Red, men i dette tilfellet skal det ikke være nødvendig å bruke...
       
    • By Fjosepose
      Nå har jeg lekt med meg mcsMQTT på HS4 noen kvelder på rad og begynner å nærme meg sammenbruddets rand. Det jeg i praksis skal gjøre er å publisere verdiene fra noen VS som er temperatursetpunkter til en broker. Dette går helt fint og jeg kan bruke disse verdiene i mitt dash board for å vise verdienen.
       
      MEN så skal jeg også endre på disse verdiene i dashboard. I terorien må man da benytte en annen topic for å unngå "feedback". Vanligvis gjøres dette ved å slenge på en /set bak klientens publish topic. Så puttes det legges subscribe-verdien inn i mcsMQTT assosieringsmenyen (etter at man først har satt opp publish)

       
      Dette har jeg altså klart etpar ganger med verdiene StueEP og StueCP, verdiene vises fint i dashboard og HS4, og jeg kunne endre begge veier. Når jeg så skal legge til flere verdier slutter det å virke for de nye verdiene selv om jeg har benyttet samme fremgangsmåte for å legge dem inn. Deretter har jeg fiklet med det og så har alt sluttet å virke.
      Det som er snodig er at jeg også har satt opp en anndre klienter( MQTTX og MQTT Explorer), og her kan jeg subscribe på topicene jeg ønsker endre på dem og puclisere akkurat som jeg vil. Broker plukker opp riktig verdier.
       
      Nå får jeg bare til å publisere fra mscMQTT på HS4...ikke noen subscription i det hele tatt. Nå er det forøvrig slik at "master" for verdiene mine er HS4....det er ikke en device som jeg skal hente verdier fra noe steds slik som muligens oftest et oppsett er.
       
      Er det noen her som behersker mcsMQTT og kan gi noen tips? Holder på å bli sprø🥳
       
×
×
  • Create New...