Gå til innhold
  • Bli medlem

The Bartender - Automatisk drikke smaker bedre


Moskus

1 868 visninger

 Del

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

 

 Del

2 kommentarer


Anbefalte kommentarer

🙌🏼 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 2
Lenke til kommentar
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 

Lenke til kommentar
Gjest
Skriv en kommentar...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

  • Lignende innhold

    • Av Guahtdim
      Dette er en plugin for å kunne styre Daikin og Panasonic varmepumpe med wifi-modul
       
      Link til siste versjon
      DakinSeer 0.0.6.2
       
      (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.6.2 - Oppdatert Panasonic appversion til 1.20.0 Takk til @Olexfor feilmelding.
      0.0.5.9 - Rettet laveste temperatur for Daikin til å være 10 grader. Takk til @lasseruud for feilmelding.
      0.0.5.8 - Mere caching av HomeSeer device data. Lagt til EcoMode for Panasonic. Takke til @toonwolf for testing og gode tips.
      0.0.5.5 - Oppdatert slik at man selv kan sette versjonsnummer for innsending av https request til Panasonic Comfort Cloud. Også oppdatert slik at Daikin eiere kan skifte ip på varmepumpen. Dette vil gjøre at man slipper å lage alt man har satt opp på nytt.
      0.0.5.4 - 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 @toonwolf for testing.
      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)
       

    • Av Moskus
      Det hender jeg eksperimenterer med Z-wave, til og med på hovedsystemet. Jeg har et par Z-wave-interfacer jeg bytter mellom (kjører restore av backup til et nytt interface før for mye testing), og det fjerner all potensiell routing-informasjon. I løpet av de første timene prøver altså huset å "finne seg selv", alt går litt tregt, og det blir høyere risiko for at noe er satt til "Unknown".
       
      Jeg skrev et script for å finne disse enhetene, og så polle dem for å faktisk lese statusen de har. Det hjelper både for å få fjernet de irriterende "Unknown"-status'ene, og det hjelper på å bedre routingen fordi kommandoen blir utført.
       
      For at dette skal fungere ut av esken må HomeSeer finne seg selv på localholst på port 80. Hvis ikke må du endre "Dim url as String"-linja.
       
      CheckForUnknown.vb
      Public Sub Main(ByVal params As Object) 'Moskus 2020 Dim subStart As DateTime = DateTime.UtcNow Dim url As String = "http://localhost/json?request=getstatus" Dim json As String = "" Dim DEBUG As Boolean = False If DEBUG Then hs.WriteLog("CheckForErrors", "Downloading data... ") Using client As New System.Net.WebClient json = client.DownloadString(url) json = json.ToLower() End Using If DEBUG Then hs.WriteLog("CheckForErrors", "Download done!") Dim searchString As String = ("{""ref"":").ToLower() Dim errorSearchString As String = ("""status"":""Unknown"",""device_type_string"":""Z-Wave Switch").ToLower() Dim lst As New System.Collections.Generic.List(Of Integer) Dim start As Integer = 0 If json.IndexOf(errorSearchString) > 0 Then ' Yes, we have errors, lets find the devices by looping through all devices While start <> -1 Dim deviceJsonStart As Integer = json.IndexOf(searchString, start) If deviceJsonStart = -1 Then Exit While Dim deviceJsonEnd As Integer = json.IndexOf(searchString, deviceJsonStart + searchString.Length) If deviceJsonEnd = -1 Then Exit While Dim deviceJson As String = json.Substring(deviceJsonStart, deviceJsonEnd - deviceJsonStart) 'This is the JSON for a device If deviceJson.Contains(errorSearchString) Then 'Check if the device contains the error and get the deviceRef if it doesn't Dim deviceRef As Integer = deviceJson.Substring(searchString.Length, deviceJson.IndexOf(",") - searchString.Length) lst.Add(deviceRef) If DEBUG Then hs.WriteLog("CheckForErrors", "Found reference '" + deviceRef.ToString + "'") End If start = json.IndexOf(searchString, deviceJsonStart + 10) End While End If For Each d As Integer In lst Dim dev As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(d) Dim devName As String = dev.Location2(hs) & ", " & dev.Location(hs) & ", " & dev.Name(hs) Dim pollResult As HomeSeerAPI.IPlugInAPI.PollResultInfo = hs.PluginFunction("Z-Wave", "", "PollDevice", New Object() {d}) hs.WriteLog("CheckForErrors", "Poll of device " & d.ToString & " (" & devName & ") returned " & pollResult.Result.ToString & " (" & pollResult.Value & ")") 'Check if the device has the correct value If pollResult.Result = HomeSeerAPI.IPlugInAPI.enumPollResult.OK OrElse pollResult.Result = HomeSeerAPI.IPlugInAPI.enumPollResult.Timeout_OK Then Dim pollValue As Integer = pollResult.Value Dim devValue As Integer = hs.DeviceValue(d) 'Set the device to the correct value If devValue <> pollValue Then For Each CAPI As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(d) If CAPI.ControlValue = devValue Then Dim response As CAPIControlResponse = hs.CAPIControlHandler(CAPI) hs.WriteLog("CheckForErrors", "Set " & d.ToString & " (" & devName & ") to " & CAPI.Label & ": " & response.ToString) Exit For End If Next End If End If Next hs.WriteLog("CheckForErrors", "Done! Elapsed time: " & Math.Round(DateTime.UtcNow.Subtract(subStart).TotalSeconds, 2) & " seconds") End Sub  
       

       
      Jeg kjører dette scriptet i et event hver 10. minutt. Men jeg har også en begrensning på at det ikke må ha vært bevegelse i huset i løpet av 5 minutter for å redusere trafikken når routingen er på det verste.
       
      Jeg hadde selvfølgelig tenkt å disable scriptet når det ikke var behov for det, men ellers merker jeg ikke noe til det for det er særdeles sjeldent scriptet finner "Unknown" lenger, det ser jeg jo nå i loggen.
    • Av Decibel
      Jeg vurderer å bytte fra HS3 til HS4, men vil gjerne høre litt om andres erfaringer før jeg tar steget. Siden jeg har mange plugins, så er jeg jeg spesielt interessert i erfaringer rundt dette med plugins som er laget for HS3. Hvor mye må kjøpes på nytt, og hvor mye kan man bruke som før? Ting som f.eks "HS3 Designer" er jo ikke akkurat gratis, og det blir fort dyrt å bytte dersom alt må kjøpes på nytt.
      Hva synes dere, nå som HS4 har vært ute en stund?
    • Av Toremick
      Har laget en mulighet for å integrere varmepumpen min direkte inn i home assistant via MQTT.
      https://github.com/toremick/shorai-esp32
       
      Sikkert kjekt for de som har varmepumpe av denne typen.
       
    • Av Offpiste
      Hei
       
      Noe av det jeg har:
       
      Home Assistant i Proxmox på Intel NUC.
       
      Lys:
      Fibaro dimmer 2
      Fibaro singel switch 2
      Fibaro double switch 2
      Fibaro wall plug
      Ikea Trådfri Adapter
      Ikea Trådfri pærer
      WLED
       
      Varme:
      Mill ovner
      Varmekabler - Elko
       
      Strømmåling:
      AMS-måler
      Shelly 
       
      Div sensorer fra :
      Netatmo
      Fibaro 
      Xiaomi mijia/Aqara/CGG1
       
       
       
       
       
×
×
  • Opprett ny...